如何在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的方式存在两个核心问题:
- 正则中的
(?:)是非捕获组,split后不会保留匹配到的街道后缀(如Ave/Rd) - trails列表里的
(Avenue)带括号,导致正则匹配时会寻找带括号的字符串,和实际地址中的Ave不匹配,从而拆分失败
内容的提问来源于stack exchange,提问作者mjoy
相关产品推荐
相关产品推荐

