2013-08-12 28 views
-2

我試圖解析readelf輸出:爲什麼這個正則表達式不捕獲請求的組?

import re 
o = '  EXIDX   0x000590 0x002c0590 0x002c0590 0x00008 0x00008 R 0x4' 
re.findall(r'^ \s+ (\w+) \s+ (?:(0x [\da-f]+)\s+)+', o, re.VERBOSE) # (1) 
# [('EXIDX', '0x00008')] 

爲什麼只有一個十六進制數被抓獲?我預計

re.findall(r'^ \s+ (\w+) \s+ (?:(0x [\da-f]+)\s+)+', o, re.VERBOSE) 
# [('EXIDX', '0x000590', '0x002c0590', '0x002c0590', '0x00008', '0x00008')] 

當我想這個RE相反,它給在僅符合第一號至少可以理解的結果:

re.findall(r'^ \s+ (\w+) \s+ (0x [\da-f]+)\s+', oo, re.VERBOSE) 
# [('EXIDX', '0x000590')] 

我不知道爲什麼我只得到了最後一個( ?)編號與RE(1)

回答

0

好吧,在我發現我需要所有的數字抓成一組,然後把它分解(感謝this question和馬亭皮特斯)

正確的代碼

r = re.findall(r'^ \s+ (\w+) \s+ ((?:0x [\da-f]+ \s+)*)', oo, re.VERBOSE) 
numbers = r[0][1].split() 
1

捕獲羣組不是匹配多個模式時會相乘。他們只捕獲一次,在這種情況下匹配的最後一種模式。

捕捉所有十六進制數,然後分裂的結果:

o = '  EXIDX   0x000590 0x002c0590 0x002c0590 0x00008 0x00008 R 0x4' 
[[r[0]] + r[1].split() for r in re.findall(r'^ \s+ (\w+) \s+ ((?:0x [\da-f]+ \s+)*)', o, re.VERBOSE)] 

輸出

[['EXIDX', '0x000590', '0x002c0590', '0x002c0590', '0x00008', '0x00008']] 

另一種方法是,以限定6組,一個用於主導EXIDX圖案,和1每個爲5個十六進制模式,但這將鎖定您的模式5個十六進制值而不是一個可變數字。

+0

你的RE結束只能用空格捕獲最後一個數字 –

相關問題