2017-02-13 5 views
2

すべてを扱うPython RegExp一致する文字列から値を取得

私はログを解析するのに些細な問題に直面しました。

ファイルを調べて、その行がパターンと一致するかどうかを確認する必要があります。 YESの場合、この行にClientIDを指定します。

:だから私は、私は正規表現検索パターンを構築しようとしたが、それは 'TRACE' でcomplete..stuckされていない99071901.

を取得する必要があります

17.02.09 10:42:31.242 TRACE [1245] GDS:  someText(SomeText).ClientID: '' -> '99071901' 

ラインは次のようになります

regex = '(^[(\d\.)]+) ([(\d\:)]+) ([\bTRACE\b]+) ([(\d)]+) ([\bGDS\b:)]+) ([\ClientID\b])' 

スクリプトコードです:

log=open('t.log','r') 
for i in log: 
    key=re.search(regex,i) 
    print(key.group()) #print string matching 
    for g in key: 
     client_id=re.seach(????,g) # find ClientIt  
log.close() 

あなたはこの挑戦を解決するためのヒントを教えていただければ幸いです。

ありがとうございます。

+1

これらの数字が必要な場合は、 'r ''(\ d +) '$" '正規表現と' .group(1) 'を取り出すだけでよいと思います。 \ s +([\ d。:] +)\ s +(TRACE)\ s + \ [(\)]のようにパターンを " GDS:。*?ClientID:\ s * '' \ s * - > \ s * '(\ d +)' $ '](https://regex101.com/r/XVRXSx/1)適切なインデックスを使用して必要なグループ –

+0

こんにちは@WiktorStribiżew、あなたのパターンをループで適用する場合:regex = "^([\ d。] +)\ s +([\ d.:]+)\s+(TRACE)\s+\[(\d+)] GDS:。*?ClientID:\ s * '' \ s * - > \ s * '(\ d +)' $ ";私はログに:key = re.search(regex、i);キーがNoneでない場合:ClientID = key.group(1); print(ClientID); else:print( 'not matching')。私はなし、一致していない – AlexPes

+0

なぜループですか?いいえ、 'm = re.search(pat、s)'、 'if m:print(m.group(n))'を使います。 'n'はグループIDです。 [The Python demo](https://ideone.com/B74GUk)を参照してください。 –

答えて

1

あなたは、あなたが興味を持っている模様で、これらの部品の周りのキャプチャ括弧を使用して、nは、対応するグループのIDであるgroup(n)を使用して、これらの部品にアクセスすることがあります。

import re 
s = "17.02.09 10:42:31.242 TRACE [1245] GDS:  someText(SomeText).ClientID: '' -> '99071901'" 
regex = r"^([\d.]+)\s+([\d.:]+)\s+(TRACE)\s+\[(\d+)] GDS:.*?ClientID:\s*''\s*->\s*'(\d+)'$" 
m = re.search(regex, s) 
if m: 
    print(m.group(1)) 
    print(m.group(2)) 
    print(m.group(3)) 
    print(m.group(4)) 
    print(m.group(5)) 

Python online demo

を参照してください。

パターンは

^([\d.]+)\s+([\d.:]+)\s+(TRACE)\s+\[(\d+)] GDS:.*?ClientID:\s*''\s*->\s*'(\d+)'$ 
です。

its online demo hereを参照してください。

文字クラスをグループ(...)のサブパターンで混乱させてキャプチャしていますが、[...]は1文字に一致する文字クラスを定義しています。

2

あなたはあまり具体的である必要はありません。セクションをキャプチャして個別に解析することができます。

例えば、ちょうどあなたの1行で始まります:その後、

line = "17.02.09 10:42:31.242 TRACE [1245] GDS:  someText(SomeText).ClientID: '' -> '99071901'" 

そして、すべてのセクション取得する私たちの最初の正規表現を追加することができます:私たちは別のセクションを見れば、今

import re 
line_regex = re.compile(r'(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+):\s+(.+)') 
# now extract each section 
date, time, level, thread, module, message = line_regex.match(line).groups() 

をより多くの決定を下すために必要なすべての情報を得ることができます。適切な種類のメッセージが表示されたら、クライアントIDを取得できるようになりました。

client_id_regex = re.compile(r".*ClientID: '' -> '(\d+)'") 

if 'ClientID' in message: 
    client_id = client_id_regex.match(message).group(1) 

さらに、client_idがあります。


このロジックをループに入れれば、すべて設定されます。

line_regex = re.compile(r'(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+):\s+(.+)') 
client_id_regex = re.compile(r".*ClientID: '' -> '(\d+)'") 

with open('t.log','r') as f: # use with context manager to auto close the file 
    for line in f: # lets iterate over the lines 
     sections = line_regex.match(line) # make a match object for sections 
     if not sections: 
      continue # probably you want to handle this case 
     date, time, level, thread, module, message = sections.groups() 
     if 'ClientID' in message: # should we even look here for a client id? 
      client_id = client_id_regex.match(message).group(1) 
# now do what you wanted to do 
+0

HI Inbar Rose、あなたのソリューションに対する多くの感謝です – AlexPes

関連する問題