如何利用正则环视获取符合要求的街道地址匹配结果
问题描述
需要从以下文本中提取以数字开头、包含下划线且以逗号结尾的街道地址字段:
001 ALLAN Witham Ross 13 Every_Street, Welltown Greenkeeper 002 ALLARDYCE Margaret Isabel 49 Bell_Road, Musicville Housewife 003 ALLARDYCE Mervyn George 49 Bell_Road, Musicville Company Mngr
期望匹配结果:
13 Every_Street, Welltown 49 Bell_Road, Musicville 49 Bell_Road, Musicville
当前使用的正则表达式:
(?ms)([0-9]+\s[A-Z][a-z].+(?=,))
存在问题:该表达式会过度匹配,从第一个地址的数字开始一直匹配到后续很远的逗号前,仅得到2个结果,无法正确提取3个目标地址。
解决方案
可以使用以下正则表达式实现需求:
\b\d+\s\w+_\w+,\s\w+
正则说明
\b:匹配单词边界,确保地址开头的数字不会和前面的用户编号(如001)混淆\d+:匹配地址起始的数字(如13、49)\s:匹配数字后的空格\w+_\w+:精准匹配包含下划线的街道名称(如Every_Street、Bell_Road),\s:匹配街道名后的逗号和空格\w+:匹配逗号后的城市名称(如Welltown、Musicville)
如果需要适配更复杂的街道命名(比如街道名包含多个下划线或额外字符),可以改用非贪婪模式避免过度匹配:
\b\d+\s.+?_\w+,\s\w+
这里的.+?是非贪婪匹配,会尽可能少地匹配字符,直到找到包含下划线的部分,再匹配到后续的逗号和城市名,确保不会跨地址匹配。
原正则失效原因
原正则中的.+是贪婪匹配,会尽可能多地抓取字符,直到遇到文本中靠后的逗号,导致第一个匹配结果覆盖了多个地址内容,最终只得到2个结果。改用精准匹配下划线结构或非贪婪模式,就能限制匹配范围,得到正确的3个地址。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

