首页 > 解决方案 > 函数 re.findall 返回带有字符串的列表,只包含一个符号

问题描述

import re

s = 'ddvvrwwwrggg'
print(re.findall(r'(.)\1*', s))  # -> ['d', 'v', 'r', 'w', 'r', 'g'] 

a = list()
for i in re.finditer(r'(.)\1*', s):
    a.append(i.group())

print(a)  # -> ['dd', 'vv', 'r', 'www', 'r', 'ggg'] 

为什么 findall 和 finditer 给出不同的结果?我需要 finditer 的,输出应该是['dd', 'vv', 'r', 'www', 'r', 'ggg'],但我不想使用循环。或者有没有更好的方法来获取所有包含相同符号的子字符串?

标签: pythonrefindall

解决方案


这确实令人惊讶,但根据文档。与 相比re.finditerre.findall如果模式中存在一个或多个组,则行为如下:

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

因此,行为差异确实令人惊讶,但“按设计”。

您可能正在寻找的表达式是:

[x.group() for x in re.finditer(r'(.)\1*', s)]

推荐阅读