正则表达,re.findall函数第一项与re.search的match结果不同,求教?

想在一行字符串中找出所有的非负整数,
例如"+14 0 10 -5 +3"中的+14, 0, 10, +3。但不返回-5 or 5。

代码如下:

print(re.findall(r"(\+\d+|[^-]\d+|[0]+)","+14 0 10 -5 +3")) #line1
print(re.findall(r"[^-](\+\d+|\d+|[0]+)","+14 0 10 -5 +3")) #line2
print(re.search(r"[^-](\+\d+|\d+|[0]+)","+14 0 10 -5 +3")) #line3
print(re.search(r"[^-](\+)?\d+","+14 0 10 -5 +3")) #line4
print(re.findall(r"[^-](\+)?\d+","+14 0 10 -5 +3")) #line5

输出结果:

['+14', ' 0', ' 10', '+3']
['14', '0', '10', '+3']
<_sre.SRE_Match object; span=(0, 3), match='+14'>
<_sre.SRE_Match object; span=(0, 3), match='+14'>
['', '', '', '+']

详细问题:
(1)按说line1和line2结果应该一样吧?
(2)按说line2的第一个返回项,应该和第三行一样,是“+14”吧?为什么是“14”呢?
(3)按说line4和line5的第一个返回结果一样都是“+14”吧?为什么出来是''空字符呢?


网上找正则表达测试,我的正则表达都能输出我想要的结果,是python的问题吗?

阅读 3.1k
2 个回答
✓ 已被采纳新手上路,请多包涵

问题解决了,findall必须开启不捕获模式,在每个括号内部以?:打头就行了

print(re.findall(r"(?:+d+|1d+)","+14 0 10 -5 +3"))
print(re.findall(r"1(?:+d+|d+)","+14 0 10 -5 +3"))
print(re.search(r"1(?:+d+|d+)","+14 0 10 -5 +3"))
print(re.search(r"1(?:+)?d+","+14 0 10 -5 +3"))
print(re.findall(r"1(?:+)?d+","+14 0 10 -5 +3"))

参考资料:
1,pein的答案
2,https://www.cnblogs.com/tk091...
3,https://www.jianshu.com/p/515...


  1. -

对于line2到line5,都是1跟+匹配,然后括号里跟剩下的字符串匹配。由于你第一字符没有捕获,所以findall的结果中没有第一个正号。而match返回的匹配的对象,并不需要捕获,所以是+14。


  1. -
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题