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

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

Mary-Kate Olsen
发布: 2024-12-29 13:21:11
原创
834 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板