如何在Python正则表达式中插入指定词列表,无需手动拼接|分隔符
实现方案
你可以通过正则动态拼接的方式实现需求,无需手动拼接所有前缀分支,推荐优先使用兼容全Python版本的捕获组方案,具体实现如下:
方案1:捕获组方案(全版本兼容)
利用re.findall默认返回捕获组内容的特性,匹配前缀后直接捕获目标编号,无需使用后向断言,代码如下:
import re pg_content = "Hello my Ref No: 9XD123D and his Buyer's Ref: 87CVX61" # 你的前缀列表 prefixes = ["Buyer's Ref:", "Ref No:", "Ref No :"] # 对每个前缀做正则转义,避免前缀中的特殊字符影响正则匹配 escaped_prefixes = [re.escape(p) for p in prefixes] # 动态拼接正则:非捕获组匹配任意前缀+空格,捕获组匹配后续的编号 pattern = rf"(?:{'|'.join(escaped_prefixes)}) ([\w\d-]+)" ref_no = re.findall(pattern, pg_content) print(ref_no)
运行输出为:['9XD123D', '87CVX61'],和你原有代码的效果完全一致。
方案2:后向断言方案(仅支持Python 3.10+)
如果你坚持要使用后向断言实现,可以用如下写法,注意仅Python 3.10及以上版本支持可变长度的后向断言:
import re pg_content = "Hello my Ref No: 9XD123D and his Buyer's Ref: 87CVX61" prefixes = ["Buyer's Ref:", "Ref No:", "Ref No :"] escaped_prefixes = [re.escape(p) for p in prefixes] # 动态拼接后向断言 pattern = rf"(?<={'|'.join(escaped_prefixes)} )[\w\d-]+" ref_no = re.findall(pattern, pg_content) print(ref_no)
注意事项
- 必须对每个前缀调用
re.escape转义,避免前缀中包含.、*、+等正则特殊字符时,正则解析出错。 - 低版本Python使用后向断言方案会抛出
look-behind requires fixed-width pattern错误,优先选择方案1。
内容的提问来源于stack exchange,提问作者user17471211
相关产品推荐
相关产品推荐

