Python使用Regex正则提取文本中Annex后跟随的所有数字编号
问题原因
原代码无法提取全部编号,核心是两个错误:
- 用了
re.search()方法,该方法只会返回整个字符串里第一个符合规则的匹配项,天然不会返回后续结果。 - 正则规则本身存在逻辑错误:字符集
[]内的+、.都会被识别为普通字符,既无法匹配1.0.1这类三段式的点分编号,也无法处理and连接的末尾编号,匹配到第一个逗号位置就会终止。
解决方案
不需要写复杂的长正则,分两步提取即可,兼容性更强,支持任意段数的点分编号、逗号/and混合分隔的场景:
- 先定位到每个
Annex关键词后、后续普通英文内容之前的完整编号列表片段 - 从该片段中提取所有符合点分数字格式的内容,就是目标编号
完整可运行代码:
import re text = """Refer to Annex 1.1, 1.2 and 2.0 containing information etc, or Refer to Annex 1.0.1, 1.1.1 containing information etc, """ # 遍历所有Annex对应的编号段 for segment_match in re.finditer(r'Annex\s+(.*?)(?=\s[a-zA-Z])', text): # 提取段内所有点分数字编号 annex_numbers = re.findall(r'\d+(?:\.\d+)+', segment_match.group(1)) print(annex_numbers)
运行输出:
['1.1', '1.2', '2.0'] ['1.0.1', '1.1.1']
规则说明
- 第一段正则
r'Annex\s+(.*?)(?=\s[a-zA-Z])':匹配Annex关键词后,跳过空格,非贪婪匹配所有内容,直到遇到前面带空格的英文字母(也就是containing这类非编号的正文内容)停止,精准截取出编号列表的完整片段。 - 第二段正则
r'\d+(?:\.\d+)+':专门匹配点分格式的数字串,不管是2段、3段还是更多段的编号都能正确识别,不受逗号、and这类分隔符的影响。
内容的提问来源于stack exchange,提问作者Surya Tej
相关产品推荐
相关产品推荐

