我有以下字符串:
'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']
。
答案 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']
捕获整个数字串,只取这个数字。