2016-03-01 17 views
1

作爲一個學習練習,我喜歡比較兩個正則表達式做同樣的事情。如何在正則表達式python中捕獲未知長度的模式?

在這種情況下,我想從字符串中提取數字的順序是這樣的:

CC_nums=[ 
'2341-3421-5632-0981-009', 
'521-9085-3948-2543-89-9' 
] 

而且在正則表達式捕獲後正確的結果將是

['2341', '3421', '5632', '0981', '009'] 
['4521', '9085', '3948', '2543', '89', '9'] 

我明白,這作品python

for number in CC_nums: 
    print re.findall('(\d+)',number) 

但是,爲了更深入地理解,我試過如下:

for number in CC_nums: 
    print re.findall('\s*(?:(\d+)\D+)+(\d+)\s*', number) 

..這將返回:

[('0981', '009')] 
[('89', '9')] 

兩個問題:

首先,爲什麼第二個返回一個元組,而不是一個列表? 其次,爲什麼第二個不匹配其他數字組,如23413241等?

我知道findall將返回非重疊捕獲組,所以我試圖避免這種情況。捕獲組由於(\d+)而不重疊,所以我認爲這不是問題。

回答

3

請參閱Python re.findall behaves weird以瞭解爲什麼re.findall返回元組列表。基本上,它會返回一個元組,因爲模式中有多個捕獲組。

正則表達式,因爲+量詞被施加到(?:(\d+)\D+)組,因此,每一個此子模式捕捉一個子時間,前一個被替換爲在組緩衝器中的新返回最後一個數字位數字串。

+0

好的,謝謝你,所以如果我理解正確,這是對你要告訴我什麼的更詳細的解釋? http://www.regular-expressions.info/captureall.html – Candic3

+0

是的,*重複捕獲組將捕獲最後一次迭代,而捕獲另一個重複組的組會捕獲所有迭代。*我嘗試使用更簡單的單詞以更簡潔的方式。你想讓我逐步說明發生的事情嗎? –

+0

一步一步可能會有幫助,但這裏讓我更加困惑:我認爲這樣做不行:'re.findall('(\ d +)+',number)'因爲它重複捕獲組* , 如你所說。但是,出於某種原因,這很好地工作?因爲它*捕獲重複的組*,但爲什麼'(\ d +)+'也可以工作,這是完全有道理的:'re.findall('(超越了我.....? – Candic3

相關問題