Python正则组合实现单次匹配单个或多个分隔数字序列方法
正则动态拼接实现连续数字序列匹配方案
原有代码问题
re.VERBOSE模式下,正则字符串中未转义的空白字符会被直接忽略,原sep定义里的空格全部失效,会导致分隔符误匹配- 原有模式的分支逻辑存在回溯漏洞,没有强制要求「分隔符后必须紧跟有效num才扩展匹配范围」,导致连续序列被拆分
- 未给num加边界约束,存在从长数字中截取前两位误匹配的风险
修改后可直接运行的代码
保持分部件动态拼接的设计,适配需求规则:
import re # 可独立替换的规则部件 # num:两位数字+可选尾随1位大写字母,加单词边界避免长数字误截取 num = fr"""\b\d\d[A-Z]?\b""" # sep:分隔符(and/or/,),用[ ]显式标注匹配真实空格,规避VERBOSE模式吞空格的问题 sep = fr"""[ ](?:and|or|,)[ ]""" # 组合规则:单个num为起点,后面仅当出现「分隔符+有效num」时才继续扩展匹配 # 天然满足:num后接sep但无后续有效num时,仅匹配当前num pattern = fr"""{num}(?:{sep}{num})*""" text= """biscuits 10 are good biscuits 20 and 30 are good biscuits 40 and hot dog are good but this one 50A and 50B and not ok""" refs = re.finditer(pattern, text, re.VERBOSE) for ref in refs: res = ref.group(0).strip() if res: print(res)
运行输出(完全符合预期)
10 20 and 30 40 50A and 50B
关键逻辑说明
- 非捕获分组
(?:)不会产生多余的捕获结果,不影响group(0)取整段匹配值,匹配效率更高 - 规则
{num}(?:{sep}{num})*等价于「1个num + 0到N组(sep+num)」,不需要写分支判断就能同时覆盖单个num、多num连续序列两种场景 - 分隔符的空格用
[ ]包裹后,在VERBOSE模式下也会被识别为需要匹配的真实空格,不会出现匹配错位
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

