2011-10-22 86 views
1

下面是我的源文件的內容:Python26,re.match只返回最後一場比賽

Number= 010010 
Name= Jan Mayen 
Country= NORWAY 
Lat= 70.9 
Long= 8.7 
... 

好像有在我的表情出現了重大失誤或re.match的誤解()因爲我需要獲取所有屬性(而不僅僅是最後一個)。

>>> pattern = re.compile(r'^(([^\n]+)=[\ ]*([^\n]+)\n)+') 
>>> print pattern.match(text).groups() 
>>> ('Standard deviations= 3.0 3.0 2.5 1.7 1.0 0.9 0.8 1.1 1.1 1.6 2.2 2.5 \n', 'Standard deviations', '3.0 3.0 2.5 1.7 1.0 0.9 0.8 1.1 1.1 1.6 2.2 2.5 ') 

任何想法?

編輯:噢..並有不同的格式以下內容,所以我不希望使用re.findall()

邁克爾

回答

6

的問題是,你重複你的捕獲組:

pattern = re.compile(r'^(...)+') 

這意味着,每場比賽,之前的比賽將被覆蓋。這是所有正則表達式引擎的預期行爲;只有少數(如.NET)允許以後訪問重複組的單個捕獲。

所以你實際上需要使用re.findall()的正確參數(例如,一個非重複組),避免你不想要的匹配。既然你沒有解釋除了你真正想要的東西之外,什麼設置了「跟隨內容」,我在這裏不能再詳細闡述。

+0

好吧,聽起來很合理。謝謝。 –

+0

好的,明確的答案。 –

3

你可能想.findall()

pattern = re.compile(r'^(([^\n]+)=[\ ]*([^\n]+)\n)', re.MULTILINE) 
pattern.findall(data) 

蒂姆的回答給出了更多的背景。

+0

剛編輯我的問題。無論如何謝謝你! –

2
>>> text = '''Number= 010010 
Name= Jan Mayen 
Country= NORWAY 
Lat= 70.9 
Long= 8.7''' 
>>> d = dict([re.split('=\w*', line, 1) for line in text.split('\n') if line]) 
>>> d 
{'Country': 'NORWAY', 
'Lat': '70.9', 
'Long': '8.7', 
'Name': 'Jan Mayen', 
'Number': '010010'} 
>>> d['Long'] 
'8.7' 
+0

謝謝你的努力! –