Python многострочное регулярное выражение извлекает текст после каждой отметки - PullRequest
1 голос
/ 01 мая 2020

У меня есть файл журнала, который я пытаюсь проанализировать. Каждый журнал имеет отметку времени в начале строки в формате YYY-MMM-DD HH:MM:SS.SSSSSS -0400:, причем информация о часовом поясе является необязательной (которую я могу пока игнорировать). Я могу сопоставить их просто отлично, но не журнал после отметки времени, которая может начинаться сразу на той же или следующей строке и может быть длиной в несколько строк. Я неплохо справляюсь с регулярными выражениями, но редко делаю многострочные регулярные выражения.

Вот то, что я пробовал, похоже, шкаф

# finds the first timestamp, everything to end of file is the log
re.findall('\n(^\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}.\d{6}).*?:(.*)', log, re.DOTALL)

# finds every timestamp, all logs are empty (obviously too un-greedy)
re.findall('\n(^\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}.\d{6}).*?:(.*?)', log, re.DOTALL)

Я просто не знаю, как go о получении следующего журнала, но остановитесь, если увидите другую метку времени.

1 Ответ

1 голос
/ 01 мая 2020

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

re.split(r'\n(?=\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}\.\d{6})', log)

Подробности

  • \n - a символ новой строки
  • (?=\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}\.\d{6}) - положительный прогноз, требующий немедленного появления следующего шаблона справа от текущего местоположения:
    • \d{4}- - четыре цифры и дефис
    • [A-Za-z]{3}- - три буквы и дефис
    • \d{2} - две цифры
    • - пробел
    • \d{2}: - две цифры и :
    • \d{2}:\d{2} - - две цифры, :, две цифры
    • \. - точка (обратите внимание, что необходимо экранировать)
    • \d{6} - шесть цифр
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...