2

私のコードは、ログ ファイルのいくつかの行を解析しています。

私はこれで多くのことを行いますが、特定の部分文字列を含まない行を見つけることができるという特定の必要性が生じました. ある条件下で

私は正規表現についてかなりよく理解しています。しかし、私はこれを理解できないようです。

error問題:またはという単語を含まない行をキャプチャしたいwarn。ログ エントリの最初の部分であり、角かっこで囲まれている場合を除きます。

これまでのところ、私は次のようなことを試しました:

(((?:abc|cba)\s+.*(?!\[?(?!error|warn)\]?).*)|((abc|cba)\s+\[(error|warn)\]\s+(.*)))

ログの行は、次の例のようになります。

キャプチャ グループ 2 :

abc [error] message
cba [error] message
cba [warn] message

キャプチャ グループ 1 :

abc something random
cba i dont know

キャプチャしない:

abc some [error] message
cba some [warn] message

簡単な英語の問題。abcまたはで始まる任意の行を取得したいcba。キャプチャ グループ 1 は、行が含まれていない場合、または行のどこにもない場合、その行を取得する必要があり[error]ます[warn]。およびキャプチャ グループ 2 は、[error]または[warn]がエントリの最初の部分 (abcまたはの後cba)である場合にのみ取得する必要があります。

4

1 に答える 1

4

これでうまくいくはずです:

^(?:abc|cba)(?:(?!.*(?:\[error\]|\[warn\]))|\s*(?:\[error\]|\[warn\])).*$

^と正規表現を一致させるために行全体をアサートすることに注意してください$

最初に行を確認しabccba開始します。

次に2つのケース:

  • どちら[error][warn]行のどこにも表示されません: (?!.*(?:\[error\]|\[warn\]))(これ?:はあまり重要ではなく、非キャプチャ グループです)。
  • または[error]or[warn]の直後に続きますabcand cba: \s*(?:\[error\]|\[warn\]). 現在の正規表現は に一致するため、に変更\s*したい場合があることに注意してください。\s+abc[error]

残りは気にしません.*が、 を使用したのでそこにある必要があります$。Pythonについてはよくわかりません.*$。正規表現の一部を削除できるかどうかを確認してください。

行が特定の形式に従うと主張しているように見えるので、すべてのグループを非キャプチャにします。同時に行からいくつかのデータを抽出する必要がある場合は、お知らせください。

于 2012-10-09T10:57:11.653 に答える