Python 正则表达式 - 从字符串中提取多个信息

2 投票
5 回答
15420 浏览
提问于 2025-04-15 11:54

我正在尝试用Python来解析一个日志文件,并用一个正则表达式匹配四个信息(时间戳、服务通知、主机名和严重性等级)。但是我似乎无法做到这一点。目前我只能匹配到四个信息中的两个。请问这样做有可能吗?下面是日志文件中的一个字符串示例,以及我目前能用的代码。任何帮助都会让我这个新手非常开心。

[1242248375] 服务警报:myhostname.com;DNS: 递归;严重;软;1;严重 - 插件在执行系统调用时超时

hostname = options.hostname

n = open('/var/tmp/nagios.log', 'r')
n.readline()
l = [str(x) for x in n]
for line in l:
    match = re.match (r'^\[(\d+)\] SERVICE NOTIFICATION: ', line)
    if match:
       timestamp = int(match.groups()[0])
       print timestamp

5 个回答

2

你可以同时使用多个组,比如:

import re

logstring = '[1242248375] SERVICE ALERT: myhostname.com;DNS: Recursive;CRITICAL;SOFT;1;CRITICAL - Plugin timed out while executing system call'
exp = re.compile('^\[(\d+)\] ([A-Z ]+): ([A-Za-z0-9.\-]+);[^;]+;([A-Z]+);')
m = exp.search(logstring)

for s in m.groups():
    print s
6

你可以使用 | 来匹配多个可能的选项中的任何一个,同时可以用 re.findall 来找到所有不重叠的匹配项。

2

这个问题有点让人困惑。不过,你不需要用正则表达式做所有事情,其实有一些简单的字符串函数也很好用,比如 'split'(分割)。

这个版本还会避免一次性把整个文件都加载到内存中,而且即使出现错误,它也会关闭文件。

regexp = re.compile(r'\[(\d+)\] SERVICE NOTIFICATION: (.+)')
with open('var/tmp/nagios.log', 'r') as file:
    for line in file:
        fields = line.split(';')
        match = regexp.match(fields[0])
        if match:
            timestamp = int(match.group(1))
            hostname = match.group(2)

撰写回答