Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-re-findall vs-finditer_Python_Regex - Fatal编程技术网

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']