re.findall 行为不一致
当尝试使用 re.findall 匹配字符串中的数值时,一些用户注意到了意外的行为。虽然 re.search 准确地检索匹配项,但 re.findall 返回一个空列表。这种明显的差异可归因于以下因素:
捕获组和 re.findall
要记住的一个关键点是,如果正则表达式模式包含捕获组。如参考文献中所定义,如果模式包含捕获组,则 re.findall 返回组列表,对于具有多个组的模式可能采用元组的形式。值得注意的是,即使是空匹配也会包含在输出中,除非它们紧接在另一个匹配之前。
非捕获组和文字转义
在提供的示例中,特定问题源于在 r'' 字符串文字中使用 \。此构造尝试匹配文字 ,而不是匹配任何单个字符(换行符除外)的预期含义。要正确匹配数值,应将模式修改为:
-?\d*\.?\d+
此模式包括以下捕获组:
演示
这是修改后的模式的 IDEONE 演示:
import re s = r'abc123d, hello 3.1415926, this is my book' pattern = r'-?\d*\.?\d+' L = re.findall(pattern, s) print(L)
此模式正确检索预期的数字匹配列表: ['123', '3.1415926'].
通过考虑捕获组的性质以及文字转义的适当用法,开发人员可以确保 re.findall 按其脚本中的预期运行。
以上是为什么在 Python 中匹配数字时 `re.findall` 返回空列表?的详细内容。更多信息请关注PHP中文网其他相关文章!