从syslog服务器提取FQDN的Python正则表达式

1 投票
4 回答
1374 浏览
提问于 2025-04-16 08:41

我正在尝试写一个正则表达式来解析我们的系统日志。我被要求考虑到每个使用这个服务的服务器。我写了一个简单的正则表达式来提取完整的域名(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']

撰写回答