如何让正则匹配到指定街道后缀词时终止以提取地址?
解决街道地址提取的正则表达式问题
先梳理你现有代码的核心错误:
- 用
[]包裹后缀列表是完全错误的——[]是字符集合,只会匹配列表里的任意单个字符,而非完整的后缀单词。 $是行尾匹配符号,但你的目标地址后还有其他文本,这直接导致匹配失败。- 正则缺少匹配街道名称中间部分的规则(比如示例里的"Random"),仅匹配数字和后缀,自然拿不到完整地址。
正确实现方式
我们可以保留你的后缀列表,将其转换为正则的多选分支,同时补充街道名称的匹配规则,代码如下:
import re # 你的街道后缀列表 street_suffixes = ['Way', 'Ave', 'Rd', 'Blvd', 'St.', 'Pl.', 'Dr.', 'Cir.', 'Ln', 'Ct', 'Hwy', 'Pkwy', 'Plaza', 'Highway', 'Court', 'Lane', 'Circle', 'Boulevard', 'Street', 'Road', 'Avenue', 'Drive', 'Place', 'Temple', 'Parkway'] # 将后缀列表转为正则多选分支,用re.escape处理特殊字符(比如.) suffix_pattern = '|'.join(re.escape(suffix) for suffix in street_suffixes) # 构建完整正则表达式 # \b:确保匹配完整单词,避免误匹配 # \d{1,4}:匹配1-4位街道号码 # \s+:匹配号码后的空格 # (?:\w+\s+)*?:非贪婪匹配街道名称的中间单词(比如Random) # (?:{}):匹配任意一个后缀 regex_partialaddress = r'\b\d{1,4}\s+(?:\w+\s+)*?(?:{})\b'.format(suffix_pattern) # 测试文本 test_text = "Hey I live at 123 Random Boulevard if you were wondering" # 执行匹配,用IGNORECASE忽略大小写 matches = re.findall(regex_partialaddress, test_text, flags=re.IGNORECASE) print(matches) # 输出: ['123 Random Boulevard']
关键规则解释
re.escape(suffix):自动转义后缀里的特殊字符(比如St.里的.,避免被正则当成通配符)。(?:...):非捕获组,仅用于分组匹配,不会额外生成捕获结果,让输出更简洁。*?:非贪婪匹配,确保正则遇到第一个后缀就停止,不会过度匹配后续内容。re.IGNORECASE:让正则不区分大小写,能匹配Boulevard、boulevard等不同写法。
内容的提问来源于stack exchange,提问作者rohin444
相关产品推荐
相关产品推荐

