我无法理解为什么这个正则表达式,
re.findall(r"(do|re|mi)+","mimi rere midore"),
生成此结果,
['mi', 're', 're'].
我的预期结果是['mimi','rere','midore'] ......
但是,当我使用这个正则表达式时,
re.findall(r"(?:do|re|mi)+","mimi rere midore"),
它会按预期生成结果。
你能告诉我两个正则表达式之间的区别吗? 谢谢。
答案 0 :(得分:9)
区别在于捕获组。通过捕获文件,findall()
仅返回 捕获的内容。没有捕获组,将返回整个匹配。
在您的第一个示例中,仅组会捕获重复或不重复的两个字符。在第二个例子中,整个匹配包括任何重复。
re.findall()
documentation对差异非常明确:
返回字符串中pattern的所有非重叠匹配,作为字符串列表。 [...]如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。
如果您的(do|re|mi)+
模式是较大模式的一部分,并且您希望findall()
仅 返回完整重复的字符集,请使用非捕获组带有捕获组的双字母选项:
r'Some example text: ((?:do|re|me)+)'