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