Мне было интересно, как я подхожу для сопоставления записей журнала, которые могут занимать несколько строк в текстовом файле, особенно с использованием Python.

[yyyy/mm/dd time] Entry
[yyyy/mm/dd time] this is
a multiline
entry
[yyyy/mm/dd time] Another entry

Так что у моего регулярного выражения в этом сценарии должно быть 3 совпадения.

В лучшем случае, у меня есть регулярное выражение, соответствующее каждой строке, но этот не соответствует, когда дело доходит до записей журнала, разделенных на несколько строк:

regex = re.compile(\[\d{4}\/\d{2}\/\d{2}.{31}].*')
0
Joe 25 Сен 2018 в 23:53

2 ответа

Лучший ответ

Вы можете перебирать свои строки и проверять совпадение - если совпадение найдено, добавьте новую запись журнала, если нет, добавьте строку в ранее захваченный журнал, т.е.

LINE_START = re.compile(r"\[\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}")  # etc.

with open("path/to/your.log", "r") as f:
    log_lines = [next(f)]  # a list to hold the log lines, initiate with the first line
    for line in f:
        if LINE_START.match(line):  # a new log line found
            log_lines.append("")  # 'register' a new log entry
        log_lines[-1] += line  # append the line to the last log entry
2
zwer 25 Сен 2018 в 21:21

Вы можете использовать re.S и re.MULTILINE, чтобы точки соответствовали символам новой строки, и использовать ^ для соответствия строк.

Затем сопоставьте все между двумя временными метками или между временной меткой и концом строки.

regex = re.compile("^\[\d{4}\/\d{2}\/\d{2}[^\]]*](.*?)(?=^\[\d{4}\/\d{2}\/\d{2}[^\]]*])|^\[\d{4}\/\d{2}\/\d{2}[^\]]*](.*?)(?!.)",re.S | re.MULTILINE)

Тест: https://regex101.com/r/dR25vY/2

0
Ruzihm 25 Сен 2018 в 21:13