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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:19:20