Python 正则表达式 - 从字符串中提取多个信息
我正在尝试用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)