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

Python正则表达式-从字符串中获取多条信息,python,regex,Python,Regex,我正在尝试使用python解析一个日志文件,并在一个正则表达式中匹配4条信息。(大纪元时间、服务通知、主机名和临界值)我似乎无法让它工作。到目前为止,我只能和四个人中的两个比赛。有可能这样做吗?下面是日志文件中的一个字符串示例,以及迄今为止我一直在使用的代码。任何帮助都会使我高兴的 [1242248375]服务警报:myhostname.com;DNS:递归;批评的软的1.严重-插件在执行系统调用时超时 hostname = options.hostname n = open('/var/tm

我正在尝试使用python解析一个日志文件,并在一个正则表达式中匹配4条信息。(大纪元时间、服务通知、主机名和临界值)我似乎无法让它工作。到目前为止,我只能和四个人中的两个比赛。有可能这样做吗?下面是日志文件中的一个字符串示例,以及迄今为止我一直在使用的代码。任何帮助都会使我高兴的

[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

您可以使用
|
来匹配各种可能的事物中的任何一种,并使用
re.findall
来获得所有与某些re不重叠的匹配。

是否可以简单到模式中的“服务通知”与示例中的“服务警报”不匹配?

问题有点混淆。但是,您不需要对正则表达式做任何事情,您可能需要尝试一些很好的简单的旧字符串函数,例如“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)

如果你想把这条线的特定部分分开,那么

大致如下:

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

应在各自的索引中分组列出这些部分。

您一次可以使用多个组,例如:

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

仅供参考,exp.match(logstring)在本例中同样适用。也就是说,解决方案不是使用search()而不是match()。当然,这一点很好。我习惯于使用搜索而不是匹配,但是因为我们从字符串的开头开始,这是一样的。关键是添加四个不同的分组参数,以获取OP想要的四样东西。