0

サンプル ログ ファイルは大きく、以下の行が含まれています。

<6>[16495.700255]

Memory - START UC1

<4>16495.723327 C0  Memory - START UC1

<4>[16495.723327] C0 [             sh] Memory - START UC1

以下Memory - START UC1 の正規表現は最初の 2 行を取得しますが、3 行目は取得しません。

re.compile("(Memory - +(.*)$)")
4

3 に答える 3

2

re.MULTILINEフラグとして使用するか、正規表現の先頭にre.compile追加します。モードがオンでない限り、任意の行の末尾に一致する場合は、文字列の末尾にのみ一致し(?m)ます。$MULTILINE

于 2013-09-26T19:55:37.540 に答える
2

あなたの質問から元の正規表現をコピーしてre.compile("(Memory - +(.*)$)")、フォローアップの回答のコードにコピーし、それを質問のサンプル テキストに対して実行し、3 つすべての一致を得ました。

@ Smac89 の提案は、文字列 ( )の先頭に暗黙的に固定されている でre.compile("(.*?Memory - START UC1)")正規表現を呼び出す場合にのみ必要です。またはを使用した場合、正規表現を読みにくくする以外は何もしません: 貪欲にゼロ以上の何かに一致するため、文字列の先頭に固定されていない場合は、最終的にゼロに一致します。とにかく文字。 そして、私がひどく間違っていない限り (あまりにも頻繁に起こります)、 の提案はさらに意味をなしません。つまり、リテラル、リテラルを除くすべての文字で構成される文字グループの 0 個または 1 個の文字に一致します。event_regex.match(line)^search(line)findall(line).*?
[^.* ]?.*、またはスペース。繰り返しますが、文字列の先頭に固定されていない場合、正規表現のその部分は、とにかくゼロ文字に一致する可能性が最も高くなります。

正直なところ、 string と正確に一致させたいことがわかっている場合は、おそらく正規表現よりもMemory - START UC1単純なものを使用したほうがよいでしょう。 しかし、最初の正規表現には(「スペース プラス」) - 1 つ以上のスペースが含まれていました。スペースの数が異なる場合は、はい、正規表現が必要です。その場合、スペースとタブ (および他のいくつかのまれな空白文字) の両方に一致することを考慮することもできます。末尾にスペースがある可能性がある場合は、文字列の終わりのアンカーの直前に配置する必要があります。(実際には、末尾のスペースが、最初の正規表現がターゲット文字列の 3 回目の出現と一致しなかった理由であると思われます。) line.contains('Memory - START UC1')
+\s+\s*$

他のいくつかのヒント:
最初の正規表現で"(Memory - +(.*)$)"は、2 つのキャプチャ グループ (つまり、かっこのセット) がありますが、「UC1」のみに関心があるか、「すべて」に関心があるかによって、実際には 1 つだけが必要であると思われます。メモリ - UC1」。
また、if not line:空白行にはまだ改行があるため、句が起動することはありません。できます-後でline.strip()既に a を実行しているので、関数呼び出しを繰り返すのではなく、ループの先頭に a を配置し、その後は単に使用します。早期にアウトするのは良い考えですが、この場合、正規表現エンジンが空白行に一致がないことを理解するのに時間がかからないため、本当に何かを節約できるかどうかはわかりません.line.strip()line = line.strip()line
最終的な考え: 特定の行で最大 1 つの一致のみを期待しているようです。その場合は、search(...)ではなくを使用してfindall(...)ください。欲しいものを見つけた後も探し続ける必要はありません。

正規表現には多少の学習曲線が伴いますが、理解すれば驚くほど強力です。それを続けてください!

于 2013-09-27T02:28:10.990 に答える
1

コンパイルを次のように変更します。

re.compile("(.*?Memory - START UC1)")

それが役立つかどうかを確認してください

イデオンに効くらしい

単語を取得したいだけの場合は、正規表現を次のように置き換えます。

regex = compile(r'([^.* ]?Memory - START UC1)')
于 2013-09-26T19:49:03.090 に答える