Python RegEx - Получение нескольких частей информации из строки - PullRequest
2 голосов
/ 29 мая 2009

Я пытаюсь использовать 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

Ответы [ 5 ]

6 голосов
/ 29 мая 2009

Вы можете использовать | для сопоставления с любой из возможных вещей и re.findall для получения всех неперекрывающихся совпадений с некоторым RE.

2 голосов
/ 29 мая 2009

Вы можете использовать более одной группы одновременно, например ::10000

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
2 голосов
/ 29 мая 2009

Вопрос немного сбивает с толку. Но вам не нужно делать все с регулярными выражениями, есть несколько хороших простых старых строковых функций, которые вы, возможно, захотите попробовать, например '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)
1 голос
/ 29 мая 2009

Если вы хотите отделить эти конкретные части линии, то.

Что-то вроде:

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

Следует указать каждую из этих частей в соответствующем индексе в группах.

0 голосов
/ 29 мая 2009

Может ли это быть так просто, как "УВЕДОМЛЕНИЕ ОБ ОБСЛУЖИВАНИИ" в вашем шаблоне не соответствует "СЕРВИСНОЕ ПРЕДУПРЕЖДЕНИЕ" в вашем примере?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...