Python-re-findall vs-finditer
我有以下字符串:Python-re-findall vs-finditer,python,regex,Python,Regex,我有以下字符串: '3 4 4 5 5 5 2 2' 我需要从中提取所有连续事件,如下所示: '44 555 22' 为此,我使用下面的代码。它工作得很好: n = input().replace(' ', '') result = re.finditer(r'(\d)\1+', n) for match in result: print(match.group(0), end=' ') 我的问题是如何修改我的正则表达式,以便使用findall()?我试着用这个: n = inpu
'3 4 4 5 5 5 2 2'
我需要从中提取所有连续事件,如下所示:
'44 555 22'
为此,我使用下面的代码。它工作得很好:
n = input().replace(' ', '')
result = re.finditer(r'(\d)\1+', n)
for match in result:
print(match.group(0), end=' ')
我的问题是如何修改我的正则表达式,以便使用findall()
?我试着用这个:
n = input().replace(' ', '')
result = re.findall(r'(\d)\1+', n)
print(result)
它只返回以下内容:['4','5','2']
这种行为的原因是什么?通过查看,该模式似乎只捕获组1而不是组0。我想我无法在
findall
上调用group()
。是否有任何方法可以改变我的模式或其他我可以做的事情来从findall
获得相同的结果?例如:['44',555',22']
您也可以捕获\1
组,然后使用列表理解将它们连接在一起:
>>> re.findall(r'(\d)(\1+)', n)
[('4', '4'), ('5', '55'), ('2', '2')]
>>> [''.join(i) for i in re.findall(r'(\d)(\1+)', n)]
['44', '555', '22']
捕获整个数字字符串,并仅获取该字符串。findall()
返回所有括号内的组(如果有),否则返回完整匹配。在您的示例中,您可以对整个组和内部组使用分组,然后您需要指定第二个组而不是第一个组的重复,并选择第一个组作为结果:
[x for x,y in re.findall(r'((\d)\2+)', '33344555')]
返回:
('333', '44', '555')
['3 3 3', '4 4', '5 5 5']
但我个人会坚持使用finditer()
。你为什么要改变它
顺便说一句,您不需要通过删除空格来准备输入:
[x for x,y in re.findall(r'((\d)(?: \2)+)', '3 3 3 4 4 5 5 5')]
返回:
('333', '44', '555')
['3 3 3', '4 4', '5 5 5']