2015-04-26 144 views
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的行爲如此?

+0

我關閉這個問題作爲一個重複[如何捕獲組在JavaScript正則表達式的任意號碼?](HTTP ://stackoverflow.com/questions/3537878/how-to-capture-an-arbitrary-number-of-groups-in-javascript-regexp)。這個問題當然不是JavaScript,但是這是同樣的問題,很好的解釋,你可以應用相同的答案。 – Kobi

+0

這絕對不是這個問題的最佳解決方案,因爲Python're.findall'方法非常具體,並且以與JS方法相比更加不同的方式處理正則表達式。 –

回答

2

這是因爲您的匹配組一次只匹配一個模式的一個實例。 +只是意味着匹配連續發生的所有事件。它仍然只是一次捕捉比賽的第一部分。

環繞你的正則表達式中的外部組,就像這樣:

((?:[A-Z][0-9]+)+) 

Demo

相關問題