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
替代思路:字符串分步处理
如果不想用正则,也可以通过字符串操作分步处理:
- 先移除地址中的所有逗号,统一格式
- 按空格分割字符串,取最后一个元素(邮编)的前一个元素作为州缩写
- 从分割后的列表中,截取从最后一个逗号后的第一个元素到州缩写前的部分作为城市
不过这种方法适配性较弱,若地址出现更多变体(比如带4位扩展邮编),正则的容错性会更强。
内容的提问来源于stack exchange,提问作者pp45
相关产品推荐
相关产品推荐

