如何修正正则表达式,避免将连续数字错误拆分为多组?
正则匹配分组修正问题
原始数据与代码
待处理的字符串列表:
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
相关产品推荐
相关产品推荐

