Python RegEx - 从字符串中获取多条信息

时间:2009-05-29 02:18:56

标签: python regex

我正在尝试使用python来解析日志文件并在一个正则表达式中匹配4条信息。 (纪元时间,服务通知,主机名和关键)我似乎无法让这个工作。到目前为止,我只能匹配四个中的两个。是否有可能做到这一点?下面是日志文件中的字符串示例以及到目前为止我已经开始工作的代码。任何帮助都会让我成为一个快乐的菜鸟。

[1242248375] SERVICE ALERT:myhostname.com; DNS:Recursive; CRITICAL; SOFT; 1; CRITICAL - 执行系统调用时插件超时

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 个答案:

答案 0 :(得分:6)

您可以使用|来匹配各种可能的内容,re.findall可以将所有非重叠匹配用于某些RE。

答案 1 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分:1)

如果您希望拆分该行的特定部分,那么。

有些事情:

match = re.match(r'^\[(\d+)\] (.*?): (.*?);.*?;(.*?);',line)

应该在各自的索引中分别给出每个部分。

答案 4 :(得分:0)

您的模式中的“服务通知”是否与您示例中的“服务警告”不匹配?