You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python正则拆分街道与门牌号:修正No+数字识别错误

解决街道名称与门牌号拆分问题:将末尾"No+数字"归为门牌号

我来帮你搞定这个问题!你当前的核心痛点是,当字符串末尾出现No + 数字的格式时,这部分被错误地归到了街道名称里,而你希望把它完全识别为门牌号。咱们来一步步修正正则表达式:

问题分析

原来的正则有两个主要问题:

  1. 街道名称的正则[A-Za-z]+\s?\w+\s?[A-Za-z]+\s?[A-Za-z]+太宽泛,会把末尾的No(属于门牌号前缀)也包含进去;
  2. 门牌号的正则没有覆盖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

火山引擎 最新活动