Python正则拆分街道与门牌号:修正No+数字识别错误
解决街道名称与门牌号拆分问题:将末尾"No+数字"归为门牌号
我来帮你搞定这个问题!你当前的核心痛点是,当字符串末尾出现No + 数字的格式时,这部分被错误地归到了街道名称里,而你希望把它完全识别为门牌号。咱们来一步步修正正则表达式:
问题分析
原来的正则有两个主要问题:
- 街道名称的正则
[A-Za-z]+\s?\w+\s?[A-Za-z]+\s?[A-Za-z]+太宽泛,会把末尾的No(属于门牌号前缀)也包含进去; - 门牌号的正则没有覆盖
No + 数字这种末尾的格式,导致这部分没被正确识别。
修正后的代码方案
我们换个思路:先精准匹配所有可能的门牌号格式(开头的数字、末尾的No+数字),再通过原字符串去除门牌号内容得到干净的街道名称,这样适配性更强:
import re # 匹配门牌号的正则:覆盖开头的数字(允许带逗号)、末尾的No+数字 pattern_apartmentnumber = re.compile(r'^\d+,?\s*|(?:No\s+\d+)$', re.VERBOSE) # 用于清理街道名称中的多余空格 pattern_street_clean = re.compile(r'\s+') test_cases = ["Street 50 No 40", "5, saint bakers holy street", "32 Syndicate street"] for i in test_cases: # 提取所有匹配的门牌号片段 apartment_parts = pattern_apartmentnumber.findall(i) # 合并片段并去除无效空白 fin_apartmentnumber = ' '.join(part.strip() for part in apartment_parts if part.strip()) # 移除原字符串中的门牌号部分 street_temp = pattern_apartmentnumber.sub('', i) # 清理街道名称里的连续空格,确保格式整洁 fin_street = pattern_street_clean.sub(' ', street_temp).strip() print("street--", fin_street) print("apartmentnumber--", fin_apartmentnumber)
预期输出
运行这段代码后,你会得到符合需求的结果:
street-- Street 50 apartmentnumber-- No 40 street-- saint bakers holy street apartmentnumber-- 5 street-- Syndicate street apartmentnumber-- 32
正则逻辑解释
pattern_apartmentnumber:^\d+,?\s*:匹配字符串开头的数字,允许数字后带逗号(比如5,),并忽略后续的空白字符;(?:No\s+\d+)$:匹配字符串末尾的No加数字的格式,(?:...)是不捕获分组,避免生成多余的分组内容;
pattern_street_clean:把多个连续的空格替换成单个空格,避免街道名称出现冗余空白。
这种反向提取的方式比直接匹配街道名称更灵活,能更好应对不同格式的地址字符串。
内容的提问来源于stack exchange,提问作者Srivatsan




