Python正则表达式在findall和search之间有不同的匹配

时间:2014-06-10 03:04:12

标签: python regex

>>> s = 'Paris is the capital and most populous city of France'
>>> re.search('(Pa.+?)\s', s).group()
'Paris '
>>> re.findall('(Pa.+?)\s', s)
['Paris']

为什么使用两种方法提取匹配的字符串最终得到两个不同的结果?

编辑:巴黎之后的空间是我所关注的。括号中没有假设排除空间吗? Blender说有组(0)和组(1)。我尝试匹配c-类似r"(c.+?)\s",而组(0)是'资本'和组(1)是' capital&#39 ;, no group(2)。

1 个答案:

答案 0 :(得分:2)

使用基于1的索引,在正则表达式匹配对象中捕获组的编号与Python中的大多数内容的编号略有不同。我认为这样做是为了与其他编程语言的正则表达式代码兼容,其中\1一直是反向引用第一个捕获组的语法。

捕获组匹配的文本可以通过m.group(1)访问,而不是像您期望的那样m.group(0)。如果您使用m.group(0)(或m.group()没有参数),您将获得完整匹配的文本,而不是捕获的组。您可以阅读更多详细信息in the docs

请注意,如果您实际上不想使用模式占用空间,则可能需要使用\b转义序列来匹配零长度字边界。