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

Python中如何从地址字符串提取城市与州缩写?

美国地址提取解决方案

问题分析

你遇到的核心问题是两个地址格式不一致:第一个地址的城市后带逗号,第二个没有,导致固定索引的rsplit(" ")[-2]方法失效(第二个地址用该方法会拿到San而非CA)。需要用更灵活的方式匹配地址中的城市和州缩写。

解决方案:正则表达式匹配

利用美国地址的固定结构(州缩写为2个大写字母,邮编为5位数字),用正则表达式可以同时提取城市和州缩写,完美适配两种地址格式。

代码实现

import re

# 待处理的地址列表
addresses = [
    "500 Rahway Avenue, Westfield, NJ 07090",
    "910 N Harbor Drive, San Diego CA 92101"
]

# 正则模式解析:
# (?:,\s*)? 匹配可选的逗号加空格(兼容两种地址格式)
# ([A-Za-z\s]+?) 捕获城市(字母+空格组合,非贪婪匹配避免多取内容)
# ([A-Z]{2}) 捕获州缩写(固定2个大写字母)
# \s+\d{5} 匹配邮编前的空格和5位数字
pattern = r'(?:,\s*)?([A-Za-z\s]+?)\s+([A-Z]{2})\s+\d{5}'

cities = []
states = []

for addr in addresses:
    match_result = re.search(pattern, addr)
    if match_result:
        # 去除城市字符串首尾可能的冗余空格
        cities.append(match_result.group(1).strip())
        states.append(match_result.group(2))

# 输出第一组(城市)
print("第一组:")
for idx, city in enumerate(cities, 1):
    print(f"{idx}){city}")

# 输出第二组(州缩写)
print("\n第二组:")
for idx, state in enumerate(states, 1):
    print(f"{idx}){state}")

运行结果

第一组:
1)Westfield
2)San Diego

第二组:
1)NJ
2)CA

替代思路:字符串分步处理

如果不想用正则,也可以通过字符串操作分步处理:

  1. 先移除地址中的所有逗号,统一格式
  2. 按空格分割字符串,取最后一个元素(邮编)的前一个元素作为州缩写
  3. 从分割后的列表中,截取从最后一个逗号后的第一个元素到州缩写前的部分作为城市

不过这种方法适配性较弱,若地址出现更多变体(比如带4位扩展邮编),正则的容错性会更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:24:56