首页 > 后端开发 > Python教程 > 为什么当 `re.search()` 找到匹配项时 `re.findall()` 返回空列表?

为什么当 `re.search()` 找到匹配项时 `re.findall()` 返回空列表?

Linda Hamilton
发布: 2024-12-19 09:23:09
原创
149 人浏览过

Why Does `re.findall()` Return an Empty List When `re.search()` Finds a Match?

re.findall 行为

如果 re.findall() 函数在以下情况下未返回预期结果,则可能会造成混乱:匹配一个字符串。让我们探讨一下其在特定情况下行为背后的原因。

问题陈述

考虑以下源字符串:

s = r'abc123d, hello 3.1415926, this is my book'
登录后复制

并且以下模式:

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'
登录后复制

通过 re.search,我们得到了正确的结果结果:

m = re.search(pattern, s)
print(m)  # <_sre.SRE_Match object; span=(3, 6), match='123'>
登录后复制

但是,re.findall 返回一个空列表:

L = re.findall(pattern, s)
print(L)  # []
登录后复制

理解问题

有两个的关键方面考虑:

  1. 空匹配捕获组: re.findall 从匹配对象返回捕获的文本,但在此模式中,没有捕获组。结果,它返回空字符串。
  2. 字符转义: \.模式中匹配两个字符:以及除换行符之外的任何字符。这不适用于匹配数值。

解决方案

要正确匹配数值,请改用以下模式:

pattern = r'-?\d*\.?\d+'
登录后复制

此模式匹配:

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

使用此更正后的模式,re.findall 将返回预期列表:

['123', '3.1415926']
登录后复制

以上是为什么当 `re.search()` 找到匹配项时 `re.findall()` 返回空列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

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