2016-08-18 10 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」であるとendキーワードは、「ABC」である:私はのようなものであるログファイルを持っています。そして、私はこれらのキーワードの間からキーワード "this is"を持つ行を抽出したいと思います。これまで..

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 

これが私の最初の部分のみを返します

反復1 = [123、456] 反復2 = [123、678]

マイコード:出力は次のようにする必要があります文字列の私は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')] 

、正規表現は、この」2つの数字、「この」から「DEF」の間のすべてのものと一致します$ num1 $ num2 'であり、そこから' ABC 'までのすべてです。ただし、外側のキャプチャグループは削除されているため、数値だけが返されます。本当によく働いた

Regular expression visualization

Debuggex Demo

+0

!どうもありがとう! – Shaz

関連する問題