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

如何在Python中按指定词汇拆分地址并提取街道、城市和州

地址拆分问题求助

我有如下嵌套地址列表:

addresses = [['123 Abc Ave Santa Monica, CA'], ['595 Apts 76 Box Rd Washington, DC'],['Avalon Apts 34 Plain St Dallas, TX']]

我希望拆分这些地址,分别提取街道地址、城市和州,目标结果如下:

street_add = ['123 Abc Ave', '76 Box Rd', '34 Plain St']
city =  ['Santa Monica', 'Washington', 'Dallas']
state =  ['CA', 'DC', 'TX']

我尝试用指定词汇列表拆分,但无法保留拆分的词汇:

# trails = ("(St)", "(Street)", "(Dr)", "(Drive)", "(Avenue)", "(Ave)", "(Court)", "(Road)")
trails = ("St", "Street", "Dr", "Drive", "(Avenue)", "(Ave)", "(Court)", "(Road)")

# \b means word boundaries.
regex = r"\b(?:{}).*".format("|".join(trails))
addresses = [re.split(regex, y) for x in addresses for y in x]

但得到的结果是:

[['123 Abc ', None, None, None, None, ''], ['76 Box', 'Road', None, None, None, ''], ['34 Plain', None, None, None, None, '']]

请问如何正确拆分出街道地址、城市和州?


解决方案

思路分析

你的地址结构有明确规律:无关前缀 + 街道地址(含数字和街道后缀如Ave/Rd/St) + 城市(1-2个单词) + 逗号 + 州(2位大写字母)。直接用正则表达式捕获目标内容,比拆分字符串更精准可靠。

实现代码

import re

addresses = [['123 Abc Ave Santa Monica, CA'], ['595 Apts 76 Box Rd Washington, DC'],['Avalon Apts 34 Plain St Dallas, TX']]

street_add = []
city = []
state = []

# 正则模式:匹配无关前缀、街道、城市、州,仅捕获目标部分
pattern = r".*?(\d+ .+?(?:St|Street|Dr|Drive|Avenue|Ave|Court|Road)) (\w+(?: \w+)?), ([A-Z]{2})"

for addr_group in addresses:
    addr = addr_group[0]
    match_result = re.match(pattern, addr)
    if match_result:
        street_add.append(match_result.group(1))
        city.append(match_result.group(2))
        state.append(match_result.group(3))

# 输出结果
print(f"street_add = {street_add}")
print(f"city = {city}")
print(f"state = {state}")

代码说明

  • .*?:非贪婪匹配开头的无关内容(如595 Apts、Avalon Apts),避免干扰街道地址的捕获
  • (\d+ .+?(?:St|Street|...)):捕获街道地址,确保包含数字开头和指定的街道后缀,非捕获组(?:)用于统一匹配后缀但不单独捕获
  • (\w+(?: \w+)?):捕获城市,支持单个或多个单词(如Santa Monica)
  • ([A-Z]{2}):捕获州,匹配2位大写字母

运行结果

street_add = ['123 Abc Ave', '76 Box Rd', '34 Plain St']
city = ['Santa Monica', 'Washington', 'Dallas']
state = ['CA', 'DC', 'TX']

原代码问题分析

你之前用re.split的方式存在两个核心问题:

  1. 正则中的(?:)是非捕获组,split后不会保留匹配到的街道后缀(如Ave/Rd)
  2. trails列表里的(Avenue)带括号,导致正则匹配时会寻找带括号的字符串,和实际地址中的Ave不匹配,从而拆分失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:17:27