我不明白为什么这个正则表达式
re.findall(r"(do|re|mi)+","mimi rere midore"),
产生这个结果,
['mi', 're', 're'].
我的预期结果是[‘mimi’,’rere’,’midore’] …
但是,当我使用此正则表达式时,
re.findall(r"(?:do|re|mi)+","mimi rere midore"),
它产生预期的结果。
您能告诉我两个正则表达式之间的区别吗?谢谢。
区别在于捕获组。在捕获组中, 仅findall()返回捕获的内容。没有捕获组,将返回整个比赛。 __
findall()
在第一个示例中,组 仅 捕获两个字符(重复或不重复)。在第二个示例中,整个比赛包括所有重复。
关于区别的re.findall()文档非常清楚:
re.findall()
返回字符串中模式的所有非重叠匹配项,作为字符串列表。[…]如果模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。如果模式包含多个组,则这将是一个元组列表。
如果你的(do|re|mi)+模式是一个更大模式的一部分,你想findall()以 仅 返回字符的全部重复设置,使用非捕获组与围绕整个捕获组的两个字母的选项:
(do|re|mi)+
r'Some example text: ((?:do|re|me)+)'