2012-09-11 30 views
1

所以,我仍然是一個正則表達式和Python的新手。我一直在尋找一些時間,但不知道如何問我在找什麼。Python - 使用正則表達式獲取用戶數據

我需要從格式化的字符串中獲取數據到列表或字典列表中。

------------------------------------------------------------------- 
Frank   114  0   0   0   0   114  
Joe   49  1   0   0   0   50   
Bob   37  0   0   0   0   37   
Sally   34  2   0   0   0   36  

這是一個腳本的輸出。目前,我有:

match_list = [] 
match = re.search('\n(\w+)\s+(\d*)\s+(\d*)', output) 
    if match: 
    match_list.append([match.group(1), 
         match.group(2), 
         match.group(3)]) 
>>>print match_list 
[['frank', '114', '0']] 

這是完美的,但我需要有match_list回報:

[['frank', '114', '0'], 
['Joe', '49', '1'], 
['Bob', '37', '0'], 
['Sally', '34', '2']] 

我最初的想法是爲循環,並檢查match.group(1)是已經列出了,如果是這樣,下一步,但後來我意識到我不知道該怎麼做。但是你現在有了。我很難弄清楚這一點。任何幫助將是太棒了! :)

哦也。列表大小發生變化。有時可能只有一個用戶,其他時間可能有20個用戶。所以我可以設置一個巨大的靜態正則表達式。 (我知道的...)

+0

有,你必須使用正則表達式(如轉讓要求),也可以使用任何其工作的原因是什麼? – DSM

+0

不,這不是一項任務。我只是數據跟蹤。我曾希望將它保存在正則表達式中,因爲我被告知它非常有用,並希望更熟悉它。如果有一種令人難以置信的簡單方式,我會很好。 – jtsmith1287

回答

4

您可以使用re.findall

match_list = [] 
match = re.findall('\n(\w+)\s+(\d*)\s+(\d*)', output) 
for k in match: 
    #k will be a tuple like this: ('frank', '114', '0') 
    match_list.append(list(k)) 

或 相同的解決方案作爲oneliner:

match_list = map(list, re.findall('\n(\w+)\s+(\d*)\s+(\d*)', output)) 
+0

這是完美的。無論如何,我需要循環比賽,所以這將爲我省下一步。這也讓我加入到我的正則表達式中,並在將來從其他列中拉出而不會出現臃腫列表。 – jtsmith1287

3

你並不需要一個正則表達式:

table="""\ 
------------------------------------------------------------------- 
Frank   114  0   0   0   0   114  
Joe   49  1   0   0   0   50   
Bob   37  0   0   0   0   37   
Sally   34  2   0   0   0   36""" 

print [line.split() for line in table.splitlines()[1:]] 

或者,如果你想要一個正則表達式:

print [list(t) for t in re.findall(r'^(\w+)'+r'\s+(\d+)'*6,table,re.MULTILINE)] 

兩種情況下,打印:

[['Frank', '114', '0', '0', '0', '0', '114'], 
['Joe', '49', '1', '0', '0', '0', '50'], 
['Bob', '37', '0', '0', '0', '0', '37'], 
['Sally', '34', '2', '0', '0', '0', '36']] 
+0

這與我所做的類似,除了我已經使用'.splitlines()'。這讓我們假設數據看起來並不像正則表達式,但我仍然從這個開始。 – DSM