Python re.findall正则匹配结果冗余重复数字问题求助
问题原因
你得到重复数字是因为re.findall会返回所有捕获组的匹配结果。你的正则表达式里有三个捕获组:
- 第一个组:
([ABC]{1,})→ 匹配字母部分 - 第二个组:
(([0-9]{1,}[,.:]{0,}){1,})→ 匹配数字和符号的组合整体 - 第三个组:
([0-9]{1,}[,.:]{0,})→ 嵌套在第二个组里的子捕获组,每次匹配一组数字+可选符号,最后一次匹配的内容(也就是最后一组数字)会被单独返回
所以findall会把这三个组的结果都放进元组里,就出现了末尾重复的数字。
解决方法
把嵌套的子捕获组改成非捕获组(用(?:...)代替(...)),这样这个组的内容不会被findall单独返回。修改后的代码如下:
import re text = "ABC9,10.11A5:6,7:8.10BC1" pattern = r"([ABC]{1,})((?:[0-9]{1,}[,.:]{0,}){1,})" result = re.findall(pattern, text) print(result) # 输出:[('ABC', '9,10.11'), ('A', '5:6,7:8.10'), ('BC', '1')]
非捕获组(?:...)的作用是定义分组用于正则逻辑匹配,但不会提取该组的匹配结果,正好符合你的需求——只保留字母部分和对应的数字符号组合这两组结果。
内容的提问来源于stack exchange,提问作者Toyo
相关产品推荐
相关产品推荐

