2016-08-18 135 views
0

我想從日誌文件中提取特定關鍵字之間的字符串/行,然後將其分配給變量或計數器。對於例如:我有一個日誌文件,這是一樣的東西:提取關鍵字之間的字符串並將其分配給變量

This is line 1 of the log file 
line 2 of the log file 
DEF this is something in line 3 
this is a 123 456 
34 
cat dog rainfall 
some relevant information 
ABC 
DEF something in this line 
this is a 123 678 
ABC 

這裏開始的關鍵字是「DEF」和結尾的關鍵字是「ABC」。我想從這些關鍵字中提取具有關鍵字「this is」的行。輸出應該是這樣的:

迭代1 = [123,456] 迭代2 = [123,678]

到目前爲止我的代碼..

import os 
import re 

def GetTheSubString(logfile): 
    with open(logfile) as p: 
     for result in re.findall('DEF(.*?)ABC', p.read(), re.S): 
      return (result) 

substr = GetTheSubString("P3.log") 
substr 

這將返回我僅所述第一部分的字符串。我有另一塊代碼已經做了123和456的映射,但我不知道它將如何與此循環綁定。任何建議都會有所幫助。謝謝!

回答

0

你的正則表達式是正確的。你做錯的唯一的事情是,自己返回第一個結果。雖然re.findall('DEF(.*?)ABC', p.read(), re.S)會找到所有相關內容,但您可以重複執行該操作,並且當您第一次點擊return時,最終只返回第一個元素。進行以下更改:

>>> import os 
>>> import re 
>>> 
>>> def GetTheSubString(logfile): 
...  with open(logfile) as p: 
...   return re.findall('DEF(.*?)ABC', p.read(), re.S) 
... 
>>> substr = GetTheSubString("P3.log") 
>>> print substr 
[' this is something in line 3\nthis is a 123 456\n34\ncat dog rainfall \nsome relevant information\n', ' something in this line\nthis is a 123 678\n'] 

現在,您可以將任何想要的內容應用於抓取的內容。

但是,如果你想要做它本身的功能,我會做:

>>> import os 
>>> import re 
>>> 
>>> def GetTheSubString(logfile): 
...  with open(logfile) as p: 
...   return re.findall('DEF(?:.*?)this is a (\d+) (\d+)(?:.*?)ABC', p.read(), re.S) 
... 
>>> substr = GetTheSubString("a") 
>>> print substr 
[('123', '456'), ('123', '678')] 

這裏,正則表達式匹配「DEF」之間的一切,「本」,兩人在「此號碼是$ num1 $ num2'以及從那裏到'ABC'的所有內容。但是,它只會返回數字,因爲外部捕獲組已被刪除。

Regular expression visualization

Debuggex Demo

+0

這工作真的很好!非常感謝! – Shaz

相關問題