Python re - findall vs finditer

时间:2017-12-20 13:03:05

标签: 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 = input().replace(' ', '')
result = re.findall(r'(\d)\1+', n)
print(result) 

它只返回:['4', '5', '2']

这种行为的原因是什么?通过查看regex,模式看起来只是捕获组1而不是组0.我想我无法在group()上呼叫findall。是否可以通过findall来改变我的模式或其他方式来获得相同的结果?例如:['44', '555', '22']

3 个答案:

答案 0 :(得分:2)

findall()返回所有带括号的组(如果有),否则返回完全匹配。在您的示例中,您可以对整体和内部使用分组,然后您需要指定第二组的重复而不是第一组,并选择第一组作为结果:

[x for x,y in re.findall(r'((\d)\2+)', '33344555')]

返回:

('333', '44', '555')

但我个人会坚持finditer()。你为什么要改变它?

顺便说一下,您不需要通过剥离空格来准备输入:

[x for x,y in re.findall(r'((\d)(?: \2)+)', '3 3 3 4 4 5 5 5')]

返回:

['3 3 3', '4 4', '5 5 5']

答案 1 :(得分:1)

您也可以捕获this.elementMap[id]组,然后使用列表推导将它们连接在一起:

\1

答案 2 :(得分:1)

import re

result = re.findall(r"((\d)\2+)", "34455522")
print(result)  # -> [('44', '4'), ('555', '5')]
result = [elem[0] for elem in result]
print(result)  # -> ['44', '555']

捕获整个数字串,只取这个数字。