如何用re.findall匹配字符串中的数字及其连续重复项?
解决连续重复数字的正则匹配问题
你用的(\d)\1+有两个问题:
- 它只能匹配至少出现2次的连续重复数字,单个数字(比如"1""3")会被直接忽略
- 因为正则里有捕获组,
re.findall会只返回捕获组的内容(也就是单个数字,而非整个连续重复串)
要实现匹配所有单个或连续重复的同数字串,你可以用下面两种方法:
方法一:调整正则表达式,直接获取完整匹配
使用((\d)\2*)作为匹配模式,这个正则会把每个连续重复的数字组完整捕获到第一个分组里:
import re s = "1222344" result = [match[0] for match in re.findall(r'((\d)\2*)', s)] print(result) # 输出: ['1', '222', '3', '44']
方法二:使用re.finditer遍历匹配对象
这种方法更直观,直接获取每个匹配的完整内容:
import re s = "1222344" result = [match.group() for match in re.finditer(r'(\d)\1*', s)] print(result) # 输出: ['1', '222', '3', '44']
补充说明
(\d)\1*的含义:匹配一个数字\d,后面跟0次或多次和它相同的数字\1*(\1是反向引用第一个捕获组的内容),这样就能覆盖单个数字(重复0次)和连续重复的情况- 如果用
(\d)\1+,+表示至少1次重复,所以只会匹配出现2次及以上的连续数字,自然漏掉单个数字
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

