3

我不明白为什么这个正则表达式,

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

产生这个结果,

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

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

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

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

它按预期生成结果。

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

4

1 回答 1

9

不同之处在于捕获组。使用捕获 froup,findall()返回捕获的内容。如果没有捕获组,则返回整个匹配项。

在您的第一个示例中,该组捕获两个字符,无论是否重复。在第二个示例中,整个匹配包括任何重复。

re.findall()文档中的区别非常清楚:

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

如果您的(do|re|mi)+模式是较大模式的一部分,并且您只想返回findall()完整的重复字符集,请为两个字母选项使用非捕获组,并围绕整个捕获组:

r'Some example text: ((?:do|re|me)+)'
于 2013-03-21T12:06:25.747 回答