首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与re.search相比,为什么re.findall的行为方式很奇怪

与re.search相比,为什么re.findall的行为方式很奇怪
EN

Stack Overflow用户
提问于 2019-05-16 02:39:06
回答 2查看 36关注 0票数 0

场景1:按预期工作

代码语言:javascript
运行
复制
>>> output = 'addr:10.0.2.15'
>>> regnew = re.search(r'addr:(([0-9]+\.){3}[0-9]+)',output)
>>> print(regnew)
<re.Match object; span=(0, 14), match='addr:10.0.2.15'>
>>> print(regnew.group(1))
10.0.2.15

场景2:按预期工作

代码语言:javascript
运行
复制
>>> regnew = re.findall(r'addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)',output)
>>> print(regnew)
['10.0.2.15']

场景3:未按预期工作。为什么输出不是'10.0.2.15‘

代码语言:javascript
运行
复制
>>> regnew = re.findall(r'addr:([0-9]+\.){3}[0-9]+',output)
>>> print(regnew)
['2.']
EN

回答 2

Stack Overflow用户

发布于 2019-05-16 03:04:46

您的正则表达式不符合您的要求:

代码语言:javascript
运行
复制
import re
output = 'addr:10.0.2.15'
regnew = re.findall(r'addr:((?:[0-9]+.){3}[0-9]+)', output)
print(regnew)

请注意,它所做的更改是我用括号将完整的IP地址括起来,并为地址的第一部分添加了'?:‘。'?:‘表示它是一个non capturing group。正如文档中所述,findall()给出了捕获的组的列表,这就是为什么您需要该列表'(?:0-9+.)‘。作为非捕获组,您希望将所有内容放在一个组中。

票数 0
EN

Stack Overflow用户

发布于 2019-05-16 03:07:42

findall和其他所有东西之间的区别在于,findall默认返回捕获组(如果有),而不是整个匹配的表达式。

一种快速的解决方法是将重复的组更改为非捕获组,这样findall将返回完全匹配的结果,而不是捕获组中的最后一个结果。

代码语言:javascript
运行
复制
addr:(?:[0-9]+\.){3}[0-9]+

这当然会将addr:包括在您的比赛中。要仅获取IP地址,请将模式和量词都包装在捕获组中。

代码语言:javascript
运行
复制
addr:((?:[0-9]+\.){3}[0-9]+)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56155756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档