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

如何修正正则表达式,避免将连续数字错误拆分为多组?

正则匹配分组修正问题

原始数据与代码

待处理的字符串列表:

A=['ABNo/2017','ABno/20/2017','ABNo461 /17','ABNo/20/17']

当前使用的正则代码(存在分组错误):

import re
A=['ABNo/2017','ABno/20/2017','ABNo461 /17','ABNo/20/17']
newlist=[]
pattern = r"\b(AB)\D*(\d+)\s?\S*(\d\d)\b"
for i in A:
    m = re.search(pattern,i)
    if m==None or m.group(3)==None:
        newlist.append('')
    else:
        newlist.append(m.group(1)+'/'+m.group(2)+'/'+m.group(3))
print(newlist)

当前输出与期望输出

  • 当前错误输出:
['AB/20/17', 'AB/20/17', 'AB/461/17', 'AB/20/17']
  • 期望输出:
['', 'AB/20/17', 'AB/461/17', 'AB/20/17']

核心需求

当数字间无符号分隔时,第二个分组读取全部数字,第三个分组为空(比如AB/2017需匹配为group(1)=AB、group(2)=2017、group(3)=None);若第三个分组为空,则在结果列表中添加空字符串。

解决方案

原正则的问题在于强制要求匹配最后两位数字,导致把连续的四位数字拆分成了两组。我们需要把第三个分组的匹配逻辑改成可选的,只有当存在分隔符+两位数字的情况时才捕获。

修正后的代码:

import re
A=['ABNo/2017','ABno/20/2017','ABNo461 /17','ABNo/20/17']
newlist=[]
# 调整正则,让第三组成为可选匹配
pattern = r"\b(AB)\D*(\d+)(?:\s?\D+(\d{2}))?\b"
for i in A:
    m = re.search(pattern,i, flags=re.IGNORECASE)  # 忽略大小写,兼容ABno这类写法
    if m is None or m.group(3) is None:
        newlist.append('')
    else:
        newlist.append(f"{m.group(1)}/{m.group(2)}/{m.group(3)}")
print(newlist)

正则逻辑说明

  • \b(AB):匹配开头的AB,搭配re.IGNORECASE兼容大小写写法
  • \D*:匹配AB后面任意数量的非数字字符
  • (\d+):捕获第一串连续数字(对应需求里的group2)
  • (?:\s?\D+(\d{2}))?:用非捕获组包裹可选匹配部分,仅当存在“可选空格+非数字字符+两位数字”时,才将这两位数字捕获到group3,末尾的?表示整个分组可选
  • \b:匹配单词边界,避免部分匹配

运行修正后的代码,输出完全符合期望。

内容的提问来源于stack exchange,提问作者edox741

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:03:19