首页 >后端开发 >Python教程 >为什么're.search”成功却're.findall”找不到字符串中的数字?

为什么're.search”成功却're.findall”找不到字符串中的数字?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-29 13:21:11846浏览

Why Does `re.findall` Fail to Find Numbers in a String When `re.search` Succeeds?

re.findall 行为不可预测

原始字符串和模式定义如下:

s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'

re.findall search 可以准确地找到匹配项,而 re.findall 会产生一个空列表。这种行为与 ['123', '3.1415926'] 的预期输出相矛盾,引发了为什么 re.findall 不会产生此结果的问题。

理解问题

有两个关键考虑因素在起作用这里:

  1. 捕获组: re.findall 仅在正则表达式模式包含捕获组时提取并返回捕获的文本。
  2. 文字反斜杠匹配: 模式中的 \ 尝试匹配文字,而不是预期的。

正则表达式修改

为了解决这个问题,我们可以修改模式以删除多余的捕获组并正确匹配数字:

pattern = r'-?\d*\.?\d+'

此模式将匹配:

  • -?d*:可选的减号和零个或多个数字
  • .?:可选小数分隔符
  • d:一个或多个数字

结果

使用此修改后的模式,re.findall 将产生预期的输出:

import re
L = re.findall(pattern, s)
print(L)  # Output: ['123', '3.1415926']

以上是为什么're.search”成功却're.findall”找不到字符串中的数字?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn