You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效拆分解析格式不统一的美国地址各组成部分

美国地址解析可落地方案

针对全量为美国地址、无需拆分街道与城市、可忽略USA标识的需求,不需要手写零散split规则适配特殊格式,以下两种方案都能覆盖你列出的所有格式场景(州与邮编连写、无逗号分隔、带/不带USA后缀等)。

方案1:使用专门的美国地址解析库(推荐,准确率最高)

  • 优先选择成熟的地址解析库,这类库不是靠固定分隔符拆分,而是基于标注的美国地址数据集训练的概率模型,对非标准格式的容错性极强。Python生态最常用的是usaddress库,安装后即可直接使用。
  • 解析前只需要做一步极简预处理:把地址末尾的, USA、 USA字符串替换为空,剔除不需要的国家标识。
  • 由于你不需要拆分街道和城市字段,解析后把街道、城市相关的返回字段拼接为一个地址主体字段,单独提取州、邮编字段即可。
  • 参考实现代码:
import usaddress

def parse_us_address(addr_str):
    # 预处理:移除USA标识
    addr_str = addr_str.replace(", USA", "").replace(" USA", "").strip()
    # 解析地址标签
    parsed_tags, _ = usaddress.tag(addr_str)
    # 合并街道、城市相关标签为地址主体
    main_part_tags = ['AddressNumber', 'StreetName', 'StreetNamePostType', 'PlaceName']
    address_main = " ".join([parsed_tags[tag] for tag in main_part_tags if tag in parsed_tags])
    state = parsed_tags.get('StateName', '')
    zipcode = parsed_tags.get('ZipCode', '')
    return {
        "address_main": address_main,
        "state": state,
        "zipcode": zipcode
    }
  • 用你提供的4条样例测试,该逻辑全部可以正确拆分:包括Santa Clara, CA95050这类州和邮编连写的场景,模型会自动识别出州为CA、邮编为95050,不会因为缺失空格拆分失败。

方案2:轻量正则规则兜底(无需引入第三方库)

如果使用场景受限、不能安装第三方依赖,可以写针对性的正则规则,鲁棒性远高于纯逗号拆分、固定位置split的逻辑:

  • 第一步先剔除USA后缀,把地址中所有逗号替换为空格,再将连续多个空格合并为单个空格,把不同格式的地址统一为空格分隔的结构。
  • 第二步从字符串末尾向前匹配5位连续数字(美国标准邮编为5位,扩展邮编为5位+横杠+4位,可按需调整正则),提取为邮编字段,将邮编部分从原字符串中剔除。
  • 第三步在剔除邮编的剩余字符串末尾,匹配2位连续大写字母(美国州名标准缩写为2位大写),提取为州字段,剩余部分即为街道+城市的地址主体。
  • 参考实现代码:
import re

def simple_parse_us_address(addr_str):
    # 预处理:移除USA标识,统一分隔格式
    addr_str = addr_str.replace(", USA", "").replace(" USA", "").strip()
    addr_str = re.sub(r',', ' ', addr_str)
    addr_str = re.sub(r'\s+', ' ', addr_str).strip()
    # 提取末尾5位邮编
    zip_match = re.search(r'(\d{5})$', addr_str)
    zipcode = zip_match.group(1) if zip_match else ''
    addr_wo_zip = addr_str[:zip_match.start()].strip() if zip_match else addr_str
    # 提取末尾2位大写州缩写
    state_match = re.search(r'([A-Z]{2})$', addr_wo_zip)
    state = state_match.group(1) if state_match else ''
    address_main = addr_wo_zip[:state_match.start()].strip() if state_match else addr_wo_zip
    return {
        "address_main": address_main,
        "state": state,
        "zipcode": zipcode
    }

注意:轻量正则方案仅适用于地址格式相对标准、无特殊异常写法的场景,如果数据中存在非标准州名、地址中夹杂其他大写数字串的情况,准确率会下降,这类场景优先选择第一种成熟库方案。

内容的提问来源于stack exchange,提问作者Felix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:01:40