1

サブストリングに関する投稿がたくさんあることは知っています。これに対する答えを探して、それらの多くを検索したと思います。

ログからの多くの文字列、行があり、それらを分類して解析しようとしています。

それらは次のようになります。

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE 静的メッセージ;動的メッセージ

ここで、ファイル名はログが置かれているファイル、日付はメッセージがログに記録された日時、TYPE はメッセージのタイプであり、メッセージは 2 つの部分 (静的部分) で構成されます。および動的部分の場合、静的部分はメッセージに対して変更されず、動的部分は (明らかに) 変更される可能性があり、それらは a で分割されますが、動的部分には;さらに多くの可能性があります;

静的メッセージと動的メッセージを抽出できるようにしたい。

これまでのところ、私は次のようなものを使用しています:

parts = line.split(";")
static = parts[0]
dynamic = ";".join(parts[1:])

あまりきれいではありません。また、私の静的部分にはファイル名と日付とタイプが含まれていますが、これは望ましくありません。それで、私はこのようなことをしたいと思った:

parts = " ".join(":".join(line.split(":")[1:]).split(" ")[4:]).split(";")
static = parts[0]
dynamic = ";".join(parts[1:])

私が試したところ、ある程度は機能しますが、ファイル名にスペースが含まれている場合や、TYPEにスペースが含まれている場合や、何かが正しく機能していない場合があり、静的メッセージの一部としてTYPEが表示されることがあります...効率はこれは、毎日解析して分類する必要がある数千行のログであるためです。このハックジョブ以外にこれを行うためのより良い方法があるかどうか疑問に思っています??

編集:ログの行の例をもっと提供すると思いました。先ほど言ったことを修正するために、エントリにはいくつかの種類があります。

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE 静的メッセージ;動的メッセージ

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 MODULE.NAME TYPE THREAD.OR.CONNECTION.INFORMATION 静的メッセージ;動的メッセージ

ご覧のとおり、ログ エントリには 2 種類あります。モジュールのないものとモジュールのあるもの、モジュールのあるものは接続に接続でき、一部はスレッドに接続できます。これにより、解析が難しくなります。

4

2 に答える 2

1

分割を最初の「;」に制限できます それだけ:

static, dynamic = line.split(';', 1)

静的部分の分割にはもう少し手間がかかるかもしれませんが、最初の部分でスペースの数が静的になることがわかっている場合は、おそらく同じトリックがそこで機能する可能性があります。

static = static.split(' ', 4)[-1]

行の最初の部分がより複雑な場合 (TYPE 部分のスペース)、それより前のすべてを削除するのがより困難になるのではないかと心配しています。あなたの最善の策は、TYPE想定できる限られた値のセットを把握し、その情報で正規表現を使用して静的部分を分割することです。

于 2012-09-03T12:21:39.313 に答える
0

次のようなものを試すことができます:

>>> regexp = re.compile("^([\/.\w]*)\:(\w{3}\s\d{2}\s\d{2}\:\d{2}\:\d{2})\s([A-Z]*)\s([\w\s]*)\;([\w\s]*)$")
>>> regexp.match(line).groups()
('/long/file/name/with.dots.and.extension', 'Jan 01 12:00:00', 'TYPE', 'Static Message', 'Dynamic Message')
于 2012-09-03T19:38:05.107 に答える