2014-12-29 87 views
1

假設我有以下字符串:瞭解蟒蛇正則表達式

out = "someUndefinedGarbageVALUE: 12 34 23 00possiblySomeOtherGarbage" 

現在我想解析「12 34 23 00」的價值。在這種情況下,我執行以下操作:

regex = re.compile('VALUE: (\d\d\s?)*') 
matches = regex.findall(out) 

然而,在這種情況下,我只會越來越:

00 

當我upgrage正則表達式一點:

regex = re.compile('VALUE: ((\d\d\s?)*)') 

我會得到:

12 34 23 00, 00 

我的問題ns:

1)與http://regexpal.com/我看到第一個表達式很好地工作。嘗試自己:

VALUE: (\d\d\s?)* 

garbageVALUE: 05 03 04garbage 

使用Python是向度。我的推理在哪裏錯了?

2)爲什麼第二個表達式恰好捕獲兩組?它應該只捕獲一個

12 34 23 00 

或所有可能的變化?

12, 12\s, 12\s34 ... 

我知道這是一個貪婪的搜索,但爲什麼正好有兩組被抓到?

+1

你是如何看待這場比賽的?對於第一個正則表達式,執行'regex.search(out).group()'返回VALUE:12 34 23 00''。你期望得到什麼? – msvalkon

+0

在Python中,您正在查看第一個捕獲組的匹配項。 'regexpal.com'顯示整個正則表達式的匹配。當你量化一個捕獲組時,它只捕獲最後一場比賽。 – Barmar

+0

在你的屏幕上試試三個例子>>> >>> re.findall(「aab」,'aabaabaabaa')','''''''''''''' re.findall(「a(a)b」,'aabaabaabaa')'現在改變你的正則表達式爲'r'(VALUE:(\ d \ d \ s?)*)「'你會明白 - 記住當你添加'('')'在正則表達式中,輸出中有一些['groups'](https://docs.python.org/2/library/re.html#re.RegexObject.groups)。 –

回答

6

其區別在於re.findall。從文檔:

如果一個或多個組中存在的格局,迴歸羣體

列表這就解釋了爲什麼你00:這就是該組(\d\d\s?)最後匹配。

和:

這將是一個元組列表,如果該模式有一個以上的組

((\d\d\s?)*)包含兩個組,所以findall回報('12 34 23 00', '00')


您可以改爲使用finditer

>>> print [match.group() for match in re.finditer('VALUE: (\d\d\s?)*', out)] 
['VALUE: 12 34 23 00']