ログファイルのすべての行を処理し、行がIP
パターンに一致する場合は住所を抽出します。メッセージにはいくつかの種類がありますand
。以下の例では、p1 p2` を使用しています。
ファイルを1行ずつ読み取ることができ、各行が各パターンに一致します。しかし、もっと多くのパターンが存在する可能性があるため、できるだけ効率的に実行したいと考えています。私はこれらのパターンを1つのオブジェクトにコンパイルし、各行に対して1回だけ一致させることを望んでいました。
import re
IP = r'(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
p1 = 'Registration from' + IP + '- Wrong password'
p2 = 'Call from' + IP + 'rejected because extension not found'
c = re.compile(r'(?:' + p1 + '|' + p2 + ')')
for line in sys.stdin:
match = re.search(c, line)
if match:
print(match['ip'])
しかし、上記のコードは機能しません。2 ip
回使用されていると文句を言います。
私の目標を達成する最もエレガントな方法は何ですか?
編集:
@Dev Khadkaからの回答に基づいてコードを変更しました。
しかし、私はまだ複数のip
マッチを適切に処理する方法に苦労しています。以下のコードは、p1に一致したすべてのIPを出力します。
for line in sys.stdin:
match = c.search(line)
if match:
print(match['ip1'])
しかし、一部の行は一致しませんp1
。彼らは一致しp2
ます。つまり、次のようになります。
1.2.3.4
None
2.3.4.5
...
それがあったwheter私にはわからないときはどうすれば、一致するIPを印刷しますかp1
、p2
...?私が欲しいのはIPだけです。どのパターンに一致したかは気にしません。