2
我想在另一個字符串中找到模式([A-Z][0-9]+)+
的子字符串。要做到這一點爲什麼re.findall匹配字符串,但沒有正確返回結果?
一種方法是:
import re
re.findall("([A-Z][0-9]+)+", "asdf A0B52X4 asdf")[0]
奇怪的是,這會產生'X4'
,不'A0B52X4'
,這是我所期望的結果。
挖了一下成這樣,我也試過,只是搭配簡單的團體字符串組成:
re.findall("[A-Z][0-9]+", "asdf A0B52X4 asdf")
其產生預期的結果:['A0', 'B52', 'X4']
而且更加有趣:
re.findall("([A-Z][0-9]+){3,}", "asdf A0B52X4 asdf")
其中產量['X4']
,但似乎仍匹配我感興趣的整個字符串,這是通過嘗試re.search
以及使用該結果來手動獲得子串:
m = re.search("([A-Z][0-9]+)+", "asdf A0B52X4 asdf")
m.string[m.start():m.end()]
這產生'A0B52X4'
。
現在從我所知道的python正則表達式中,括號不僅僅匹配裏面的RE,而且還聲明瞭一個「組」,它可以讓你用它做各種事情。我的理論是,由於某種原因,re.findall
只將組中的最後一個匹配放入結果字符串中,而不是完整匹配。
爲什麼re.findall
的行爲如此?
我關閉這個問題作爲一個重複[如何捕獲組在JavaScript正則表達式的任意號碼?](HTTP ://stackoverflow.com/questions/3537878/how-to-capture-an-arbitrary-number-of-groups-in-javascript-regexp)。這個問題當然不是JavaScript,但是這是同樣的問題,很好的解釋,你可以應用相同的答案。 – Kobi
這絕對不是這個問題的最佳解決方案,因爲Python're.findall'方法非常具體,並且以與JS方法相比更加不同的方式處理正則表達式。 –