python正则表达式:re.findall(r“(do | re | mi)+”,“mimi rere midore”)

时间:2013-03-21 12:04:39

标签: python regex

我无法理解为什么这个正则表达式,

re.findall(r"(do|re|mi)+","mimi rere midore"),

生成此结果,

['mi', 're', 're'].

我的预期结果是['mimi','rere','midore'] ......

但是,当我使用这个正则表达式时,

re.findall(r"(?:do|re|mi)+","mimi rere midore"),

它会按预期生成结果。

你能告诉我两个正则表达式之间的区别吗? 谢谢。

1 个答案:

答案 0 :(得分:9)

区别在于捕获组。通过捕获文件,findall()仅返回 捕获的内容。没有捕获组,将返回整个匹配。

在您的第一个示例中,组会捕获重复或不重复的两个字符。在第二个例子中,整个匹配包括任何重复。

re.findall() documentation对差异非常明确:

  

返回字符串中pattern的所有非重叠匹配,作为字符串列表。 [...]如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

如果您的(do|re|mi)+模式是较大模式的一部分,并且您希望findall() 返回完整重复的字符集,请使用非捕获组带有捕获组的双字母选项:

r'Some example text: ((?:do|re|me)+)'