Python не распознает допустимую запись RegEx - PullRequest
2 голосов
/ 18 июня 2020

Я пытаюсь написать сценарий Python для анализа файла журнала. Ядро скрипта заимствовано из pythoni c способами .

import re
log_file_path = r"O:\ZTK log file parser\2 Parsing Log\JP"
regex = '8355371640847825590'
match_list = []

with open(log_file_path, "r") as file:
    for line in file:
        for match in re.finditer(regex, line, re.S):
            match_text = match.group()
            match_list.append(match_text)
print(match_list)  # work in progress

Приведенный выше пример хорошо работает при синтаксическом анализе простых строковых значений. Но когда я пытаюсь вставить переменную регулярного выражения:

regex = '((.*\n){2}).*8355371640847825590'

Он всегда возвращает пустой список.

Меня беспокоит то, что это выражение действительно хорошо работает в тестовых средах, таких как https://regex101.com/. Каждое значение правильно сопоставлено. К сожалению, я не могу воспроизвести это в Python.

Буду признателен, если вы мне поможете.

1 Ответ

1 голос
/ 18 июня 2020

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

(?m)^(?:.*\n){2}.*8355371640847825590

См. демонстрацию регулярных выражений .

Подробности

  • (?m) - (встроенный модификатор re.M / re.MULTILINE) ^ теперь будет соответствовать началу позиции
  • ^ - начало строки
  • (?:.*\n){2} - две строки с разрывами строк
  • .*8355371640847825590 - любые 0 или более символов, кроме символов разрыва строки, как можно больше, а затем 8355371640847825590

Python демо:

import re
log_file_path = r"O:\ZTK log file parser\2 Parsing Log\JP"
regex = '(?m)^(?:(?:.*\n){2}).*8355371640847825590'
match_list = []

with open(log_file_path, "r") as file:
    match_list = re.findall(regex, file.read())

print(match_list)
...