You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让正则匹配到指定街道后缀词时终止以提取地址?

解决街道地址提取的正则表达式问题

先梳理你现有代码的核心错误:

  1. 用[]包裹后缀列表是完全错误的——[]是字符集合,只会匹配列表里的任意单个字符,而非完整的后缀单词。
  2. $是行尾匹配符号,但你的目标地址后还有其他文本,这直接导致匹配失败。
  3. 正则缺少匹配街道名称中间部分的规则(比如示例里的"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:35:37