0

こんにちは私はRegExを使用して、ログファイルを後でデータベースに入るグループに分割しようとしています。何らかの理由で、最後のグループに文字列の最後の単語を改行文字で含めることができません。

解析しているログファイルは次のようになります。

12:00:01 GRP this is a test1
12:02:03 TES here something else has happend
12:32:22 MCH This processe is finished

それらを3つのグループにグループ化したい

Time
3-letter code
Text

現在Pythonで私はこれを使用しています:

def parse (s):
    mO = re.search ('([0-9][0-9]:[0-9][0-9]:[0-9][0-9]) (\w*) (\w.+) ',s)
    if mO:
     print "1: "+mO.group(1)
     print "2: "+mO.group(2)
     print "3: "+mO.group(3)

私が得る結果は次のとおりです。

1: 12:00:01
2: GRP
3: this is a
1: 12:02:03
2: TES
3: here something else has
1: 12:32:22
2: MCH
3: This processe is

改行が付加されている文字列の最後の単語が常に欠落しています。すべてのバリエーションで\n\ rを追加しようとしましたが、1日の検索で完全に失われました。

どんな助けでも大歓迎です。

4

4 に答える 4

2

では'(\w.+) '最後の空白が見つかるまで、 ( )all( )文字を熱心に+キャプチャします。().

   # Extra tail whitepace removed   
   mO = re.search ('([0-9][0-9]:[0-9][0-9]:[0-9][0-9]) (\w*) (\w.+)',s)
于 2013-01-03T10:16:14.437 に答える
0

整形式のログファイル(すべての行が同じように見える)の場合、正規表現で複雑にしすぎず、プレーンスプリットを使用します

def parse(s):
  time, code_3_letter, message = s.split(None, 2)
  # ...

単純にする!

于 2013-01-03T10:18:58.850 に答える
0

私は正規表現とログ解析の経験が豊富です。(私の仕事の一部です)

正規表現を使用してファイル全体を検索する代わりに、ファイルの行を正規表現にフィードする必要があります。これにより、ファイル全体を一度に1行だけメモリに保存するのではなく、パフォーマンスが大幅に向上します。また、正規表現を使用すると、他のmatchどの表現よりもはるかに高速になります。これが私がそれをする方法です:

import re

def parse_logs(file_path):
    results = []
    regex = re.compile(r'(\d\d:\d\d:\d\d) (\S\S\S) (.+)')
    with open(file_path) as f:
        for line in f:
            ms = regex.match(line.strip())
            if not ms:
                continue
            results.append([ms.group(1), ms.group(2), ms.group(3)])
    return results

または、さらに良いアプローチとして、それをジェネレーターに変換します。

def parse_logs(file_path):
    regex = re.compile(r'(\d\d:\d\d:\d\d) (\S\S\S) (.+)')
    with open(file_path) as f:
        for line in f:
            ms = regex.match(line.strip())
            if not ms:
                continue
            yield (ms.group(1), ms.group(2), ms.group(3))
于 2013-01-03T10:21:04.760 に答える
0

よりシンプルで短い正規表現:

[0-2][0-9](:[0-9]{2}){2} [A-z]{3} .*$

これは、有効な時間(入力形式に基づく)に続いてスペース、3文字*、別のスペースに一致し、行の終わりまですべてに一致します。これにより、句読点などが含まれている場合でも、「テキスト」部分をキャプチャできます。

* [Az]は小文字に一致します。それが望ましくない場合は、代わりに[AZ]を使用してください

于 2014-11-20T17:19:10.197 に答える