Python的事情 - 主场迎战的FindAll顺劈斩

问题描述 投票:3回答:3

我有以下字符串:

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

python regex
3个回答
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组,然后使用list comprehension将它们连接在一起:

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

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

捕获整个数字串,并只采取。

© www.soinside.com 2019 - 2024. All rights reserved.