在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  Python/ 正則表達(dá),re.findall函數(shù)第一項與re.search的match結(jié)果不同

正則表達(dá),re.findall函數(shù)第一項與re.search的match結(jié)果不同,求教?

想在一行字符串中找出所有的非負(fù)整數(shù),
例如"+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

輸出結(jié)果:

['+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'>
['', '', '', '+']

詳細(xì)問題:
(1)按說line1和line2結(jié)果應(yīng)該一樣吧?
(2)按說line2的第一個返回項,應(yīng)該和第三行一樣,是“+14”吧?為什么是“14”呢?
(3)按說line4和line5的第一個返回結(jié)果一樣都是“+14”吧?為什么出來是''空字符呢?


網(wǎng)上找正則表達(dá)測試,我的正則表達(dá)都能輸出我想要的結(jié)果,是python的問題嗎?

回答
編輯回答
玄鳥

對于line2到line5,都是1跟+匹配,然后括號里跟剩下的字符串匹配。由于你第一字符沒有捕獲,所以findall的結(jié)果中沒有第一個正號。而match返回的匹配的對象,并不需要捕獲,所以是+14。


  1. - ?
2017年8月1日 06:32
編輯回答
萌吟

問題解決了,findall必須開啟不捕獲模式,在每個括號內(nèi)部以?:打頭就行了

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. - ?
2018年3月29日 22:11