1

syslog を解析する正規表現を作成しようとしています。サービスを使用する各サーバーのアカウントを作成するよう求められました。FQDNを引き出す簡単な正規表現を書きましたが、行を消費しすぎているようです...

>>> string = "2010-12-13T00:00:02-05:00 <local3.info> suba1.suba2.example.com named[29959]: client 192.168.11.53#54608: query: subb1.subb2.example.com"
>>> regex = re.compile("\s.*?\.example\.com ")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0x896dae0bbf9e6bf0>

# Run findall
>>> regex.findall(string)
[u' <local3.info> suba1.suba2.example.com ', u' client 192.168.11.53#54608: query: subb1.subb2.example.com ']

ご覧のとおり、 .* を使用した findall は一般的すぎて、正規表現が大量に消費してしまいます。

4

4 に答える 4

0

\swith\b.*?withを置き換えると、\Sそれが行われます。

>>> regex = re.compile(r'\b\S*\.example\.com')
>>> regex.findall(string)
[u'suba1.suba2.example.com', u'subb1.subb2.example.com']
于 2010-12-17T16:19:55.477 に答える
0

正規表現

r"query: ([\w\.]+)"

[...] クエリから末尾を取得すると、名前のないグループ ルックアップを使用してドメイン名だけを取得できます。

これが必要な出力ではない場合は、目的の出力について詳しく説明できますか (データ構造として。私はこれを推測しました)。

Python コードは次のようになります。

match = re.search(r"query: ([\w.]+)", string, re.IGNORECASE | re.MULTILINE)
if match:
    result = match.group(1)
else:
    result = ""

結果には次が含まれます

subb1.subb2.example.com
于 2010-12-17T16:23:05.620 に答える
0
#!/usr/bin/env python

import re

s = """2010-12-13T00:00:02-05:00 <local3.info> 
    suba1.suba2.example.com named[29959]: 
    client 192.168.11.53#54608: query: subb1.subb2.example.com"""

pattern = re.compile("[\S.]+.example.com")

print pattern.findall(s)
# => ['suba1.suba2.example.com', 'subb1.subb2.example.com']
于 2010-12-17T16:24:02.877 に答える
0

使用してみてください:

regex = re.compile("\s\S*?\.example\.com ")
于 2010-12-17T16:27:14.223 に答える