函数 re.findall 返回带字符串的列表,只包含一个符号

问题描述

import re

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

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

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

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

解决方法

这确实令人惊讶,但根据 docs。与 re.finditer 不同的是,如果模式中存在一个或多个组,re.findall 的行为如下:

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

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

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

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