场景1:按预期工作
>>> 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:按预期工作
>>> 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‘
>>> regnew = re.findall(r'addr:([0-9]+\.){3}[0-9]+',output)
>>> print(regnew)
['2.']
发布于 2019-05-16 03:04:46
您的正则表达式不符合您的要求:
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+.)‘。作为非捕获组,您希望将所有内容放在一个组中。
发布于 2019-05-16 03:07:42
findall和其他所有东西之间的区别在于,findall默认返回捕获组(如果有),而不是整个匹配的表达式。
一种快速的解决方法是将重复的组更改为非捕获组,这样findall将返回完全匹配的结果,而不是捕获组中的最后一个结果。
addr:(?:[0-9]+\.){3}[0-9]+
这当然会将addr:
包括在您的比赛中。要仅获取IP地址,请将模式和量词都包装在捕获组中。
addr:((?:[0-9]+\.){3}[0-9]+)
https://stackoverflow.com/questions/56155756
复制相似问题