>>> 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)。
答案 0 :(得分:2)
使用基于1的索引,在正则表达式匹配对象中捕获组的编号与Python中的大多数内容的编号略有不同。我认为这样做是为了与其他编程语言的正则表达式代码兼容,其中\1
一直是反向引用第一个捕获组的语法。
捕获组匹配的文本可以通过m.group(1)
访问,而不是像您期望的那样m.group(0)
。如果您使用m.group(0)
(或m.group()
没有参数),您将获得完整匹配的文本,而不是捕获的组。您可以阅读更多详细信息in the docs。
请注意,如果您实际上不想使用模式占用空间,则可能需要使用\b
转义序列来匹配零长度字边界。