Python Regex для разделения лог-файла по дате - PullRequest
1 голос
/ 08 октября 2019

У меня есть некоторые данные, которые имеют неправильный формат (которым я не могу управлять), и отдельные события иногда охватывают несколько строк. Моя стратегия состоит в том, чтобы удалить все новые строки и управляющие символы, разбросанные по данным, чтобы создать единый поток, а затем разделить его обратно на основе согласованной строки даты / времени, которая всегда находится в начале нового действительного события.

Я начал со следующего регулярного выражения, чтобы выполнить это:

new_data = "".join(ch for ch in attachment_data if unicodedata.category(ch)[0]!="C")
new_data2 = re.split('([0-9]+/[0-9]+/[0-9]+ [0-9]+:[0-9]+:[0-9]+\s[AaPp][Mm];)',new_data)

Однако мой разделитель (строка даты / времени) заканчивается в другом элементе в результирующем списке. Мне нужно, чтобы он был включен со всеми данными между ним и следующим разделителем. Я искал решения, но не сталкивался с чем-то, что работает.

Так что вместо:

['9/26/2019 6:30:20 PM;', "Last, First;FRONT DOOR;Admitted 'Last, First' (Card: 123456)   at 'FRONT DOOR' (IN).]

Я ищу:

['9/26/2019 6:30:20 PM;Last, First;FRONT DOOR;Admitted 'Last, First' (Card: 123456)   at 'FRONT DOOR' (IN).]

Спасибо!

1 Ответ

0 голосов
/ 08 октября 2019

Используйте положительный lookahead:

import re

text = """
9/26/2019 6:30:20 PM;Last, First;FRONT DOOR;Admitted 'Last, First' (Card: 123456)   at 'FRONT DOOR' (IN).1.
9/26/2019 6:30:20 PM;Last, First;FRONT DOOR;
Admitted 'Last, First' (Card: 123456)   at 'FRONT DOOR' (IN).2.
9/26/2019 6:30:20 PM;Last, First;FRONT DOOR;Admitted 'Last, First' (Card: 123456)   at 
'FRONT DOOR' (IN).3.
"""
# match d/m/yyyy hh:mm:ss
date_pattern = r'[0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}\s(?:[0-9]{1,2}:){2}[0-9]{1,2}\s(?:am|pm);'
# extract text begin by date pattern and followed by date pattern or end of text
ptrn = r"(?i){date_pattern}.+?(?={date_pattern}|$)".format(date_pattern=date_pattern)
result = re.findall(ptrn, text.replace('\n', ''))
for line in result:
    print(line)

Выход:

9/26/2019 6:30:20 PM;Last, First;FRONT DOOR;Admitted 'Last, First' (Card: 123456)   at 'FRONT DOOR' (IN).1.
9/26/2019 6:30:20 PM;Last, First;FRONT DOOR;Admitted 'Last, First' (Card: 123456)   at 'FRONT DOOR' (IN).2.
9/26/2019 6:30:20 PM;Last, First;FRONT DOOR;Admitted 'Last, First' (Card: 123456)   at 'FRONT DOOR' (IN).3.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...