Как вы используете регулярное выражение для анализа текста по нескольким строкам из файла журнала? - PullRequest
4 голосов
/ 12 апреля 2019

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

04/10/2019 02:52:59 PM INFO: Model Details:
04/10/2019 02:53:12 PM INFO: Final Input: [  220.12134       3.7499998    75.00001     111.44428      22.500004
    37.5          73.361534  1000.709    ]
04/10/2019 02:53:12 PM INFO: Difference: [ 11.974823 647.91406 ]
04/10/2019 02:53:12 PM INFO: Number: 169
04/10/2019 02:53:12 PM INFO: Time: 13.554227686000004 seconds

Я хотел бы получить вывод массива:

[220.12134, 3.7499998, 75.00001, 111.44428, 22.50000437.5, 73.361534, 1000.709]

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

log_file_path = some_log.log
#regex = '\[(.*?)\]'
regex2 = '(Final Input: \[)(.*?)(\]|\n)'

with open(log_file_path, 'r') as file:
    all_log_file = file.read()
    a = re.findall(regex2, all_log_file)
    print(a)

file.close()
#x = list(map(float, a.split()))

Я получаю следующий вывод, в котором отсутствуют значения окончательного ввода в следующей строке (я могу проанализировать приведенный ниже вывод в виде массива):

[('Final Input: [', '  220.12134       3.7499998    75.00001     111.44428      22.500004', '\n')]

1 Ответ

1 голос
/ 12 апреля 2019

Используйте спецификатор non-жадный вместе с re.DOTALL, что означает, что . включает \n:

import re

regex2 = '(Final Input: \[.+?\])'

a = re.findall(regex2, text, re.DOTALL)
a

Выход:

['Final Input: [  220.12134       3.7499998    75.00001     111.44428      22.500004\n    37.5          73.361534  1000.709    ]']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...