2013-08-01 49 views
0

根據RE匹配括號中的數據我想使用Python來基於匹配的文本應用程序日誌中獲取數據的節。一個僞示例看起來像這樣:試圖在glob的蟒蛇

Error_Paragraph = [ 
    data1 = 'abcdefg' 
    data2 = '123556' 
    data3 = 'supercalifragilistic' 
    data4 = 'expealadocious' 
    .... 
    data106 = 'critical info' 
    .... 
] 

這些日誌中有很多節...都帶有「data106」類型標識符。只抓取匹配「Error_Paragraph」的節的最佳方法是什麼?這將是有益的抓住整個段落,但我特別只在「Error_Paragraph」尋找「data106」

我已經嘗試了幾次迭代這個,但似乎無法正確吸入段落。真正好的東西是將這些全部吸收到字典中,以便我可以根據需要訪問這些項目。

謝謝!目前嘗試的

例子:

import re 
import gzip 
import sys 

f = gzip.open(sys.argv[1], 'rb') 

dataDict = re.findall(r"Error_Paragraph = \[[^\]]*data106 = '([^']*)'", s) 

print dataDict 

我得到以下輸出:

File "./logfile.txt", line 10 
dataDict = re.findall(f"^\$Error_Paragraph = \[[^\]]*data106 = '([^']*)'", s) 
+0

'findall'在案,以返回任何團體或'tuple's(其中'tuple's將包含多個組)的列表。輸出看起來可能是某種錯誤。這是確切的輸出;沒有別的了嗎?什麼是's'?你的代碼使用它,但它沒有在你共享的代碼中的任何地方定義。 – jpmc26

+0

另外,文本是否可以包含方括號('[]')? – jpmc26

+0

輸出看起來像是錯誤回溯的一部分。請發佈完整的回溯。 –

回答

1

假設這些節不包含[括號],您可以搜索

Error_Paragraph = \[[^\]]*data106 = '([^']*)' 

然後看比賽的.groups(1)re.findall()會自動爲你做的:

>>> import re 
>>> s = """Some_Paragraph = [ 
...  data1 = 'abcdefg' 
...  data106 = 'uninteresting info' 
... ] 
... 
... Error_Paragraph = [ 
...  data3 = 'supercalifragilistic' 
...  data106 = 'critical info' 
... ] 
... 
... Other_Paragraph = [ 
...  data4 = 'expealadocious' 
...  data106 = 'boring info' 
... ]""" 
>>> re.findall(r"Error_Paragraph = \[[^\]]*data106 = '([^']*)'", s) 
['critical info'] 
+0

@ Tim-Pietzker - 謝謝你的回覆。 由於日誌文件的當前大小,我從另一個文件中讀取它們。我修改我的嘗試,並在原崗位貼吧...屠宰你的建議: – version7x

+0

我的解決方案假定該文件的內容已經被讀入's'。在使用正則表達式之前,您需要這樣做,因爲它們只能用於字符串,而不能用於文件。 –