从syslog服务器提取FQDN的Python正则表达式
我正在尝试写一个正则表达式来解析我们的系统日志。我被要求考虑到每个使用这个服务的服务器。我写了一个简单的正则表达式来提取完整的域名(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 个回答
0
试试这个:
regex = re.compile("\s\S*?\.example\.com ")
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
0
把 \s
替换成 \b
,然后把 .*?
替换成 \S
就可以了。
>>> regex = re.compile(r'\b\S*\.example\.com')
>>> regex.findall(string)
[u'suba1.suba2.example.com', u'subb1.subb2.example.com']