我不明白为什么这个正则表达式,
re.findall(r"(do|re|mi)+","mimi rere midore"),
产生这个结果,
['mi', 're', 're'].
我的预期结果是 ['mimi', 'rere', 'midore']...
但是,当我使用这个正则表达式时,
re.findall(r"(?:do|re|mi)+","mimi rere midore"),
它按预期生成结果。
你能告诉我两个正则表达式之间的区别吗?谢谢你。
不同之处在于捕获组。使用捕获 froup,仅findall()
返回捕获的内容。如果没有捕获组,则返回整个匹配项。
在您的第一个示例中,该组仅捕获两个字符,无论是否重复。在第二个示例中,整个匹配包括任何重复。
re.findall()
文档中的区别非常清楚:
返回字符串中模式的所有非重叠匹配,作为字符串列表。[...] 如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。
如果您的(do|re|mi)+
模式是较大模式的一部分,并且您只想返回findall()
完整的重复字符集,请为两个字母选项使用非捕获组,并围绕整个捕获组:
r'Some example text: ((?:do|re|me)+)'