Skip to main content
 首页 » 编程设计

findall和search之间的Python正则表达式差异匹配

2024年11月01日28shangdawei

>>> 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 说有 group(0) 和 group(1)。我试图匹配 c- 类似 r"(c.+?)\s" 和 group(0) 是 'capital' 和 group(1) 是 'capital',没有 group(2 ).

请您参考如下方法:

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

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

请注意,如果您实际上不想用您的模式占用空间,您可能想改用 \b 转义序列来匹配零长度单词边界。