Проблема с Python при печати группы регулярных выражений из файла журнала - PullRequest
3 голосов
/ 27 октября 2019

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

Я бы хотел, чтобы они читались как:

12345@email.com = 19290 45678@email.com = 23625

В этом случаеЯ хочу, чтобы распечатывались только данные аккаунта и рекордов из категории 2. Я довольно новичок в Python, но я пытаюсь узнать больше с практикой. кажется, что мое регулярное выражение не возвращает никаких совпадений в python, но когда я использую этот инструмент Regex101 , я получаю две группы с моим кодом регулярного выражения. Может быть, проблема в том, как я печатаю группы. Буду признателен за любую помощь, чтобы я мог учиться на своих ошибках. :)

Вот мой код:

import re

log = open(r"C:\CurrentLog.txt","r")
regex = re.compile("Category2-{25}\n.{51}(?P<Account>.{11}\.com).\.\.(?:$\n^.*){5}High Score = (?P<Score>\d{2,})", re.M)

for line in log:
    data = regex.findall(line)
    for word in data:
        print (line.group(Account))
        print (line.group(Score))

Пример файла журнала:

фактический файл журнала останетсяоколо 400 - 600 строк, поэтому я не беспокоюсь о загрузке его в память.

2019-10-17 17:56:44,295 :: INFO :: root :: -------------------------Category1-------------------------
2019-10-17 17:56:49,988 :: INFO :: root :: Account 12345@email.com...
2019-10-17 17:57:09,328 :: INFO :: root :: other info 1
2019-10-17 18:00:22,267 :: INFO :: root :: other info 2
2019-10-17 18:00:22,582 :: INFO :: root :: High Score = 19090
2019-10-17 18:00:22,582 :: INFO :: root :: other info 3
2019-10-17 18:00:22,582 :: INFO :: root :: other info 4
2019-10-17 18:00:24,661 :: INFO :: root :: -------------------------Category2-------------------------
2019-10-17 18:00:29,619 :: INFO :: root :: Account 12345@email.com...
2019-10-17 18:00:46,317 :: INFO :: root :: other info 1
2019-10-17 18:05:46,088 :: INFO :: root :: other info 2
2019-10-17 18:05:52,451 :: INFO :: root :: other info 3
2019-10-17 18:08:11,765 :: INFO :: root :: other info 4
2019-10-17 18:08:12,813 :: INFO :: root :: High Score = 19290
2019-10-17 18:08:12,814 :: INFO :: root :: other info 5
2019-10-17 18:08:12,814 :: INFO :: root :: other info 6
2019-10-17 18:08:14,890 :: INFO :: root :: -------------------------Category1-------------------------
2019-10-17 18:08:19,860 :: INFO :: root :: Account 45678@email.com...
2019-10-17 18:08:37,188 :: INFO :: root :: other info 1
2019-10-17 18:13:23,232 :: INFO :: root :: other info 2
2019-10-17 18:13:23,595 :: INFO :: root :: High Score = 23425
2019-10-17 18:13:23,595 :: INFO :: root :: other info 3
2019-10-17 18:13:23,595 :: INFO :: root :: other info 4
2019-10-17 18:13:25,689 :: INFO :: root :: -------------------------Category2-------------------------
2019-10-17 18:13:30,660 :: INFO :: root :: Account 45678@email.com...
2019-10-17 18:13:47,727 :: INFO :: root :: other info 1
2019-10-17 18:16:20,327 :: INFO :: root :: other info 2
2019-10-17 18:16:26,907 :: INFO :: root :: other info 3
2019-10-17 18:18:44,376 :: INFO :: root :: other info 4
2019-10-17 18:18:45,447 :: INFO :: root :: High Score = 23625
2019-10-17 18:18:45,447 :: INFO :: root :: other info 5
2019-10-17 18:18:45,447 :: INFO :: root :: other info 6

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или контекст.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 27 октября 2019

Код ниже может помочь вам. Я дам вам список кортежей, содержащих электронную почту и счет.

log_text = open(r"log.txt", "r").read()
regex = re.compile(r"Category2-{25}\n.{51}(?P<Account>.{11}\.com).\.\.(?:$\n^.*){5}High Score = (?P<Score>\d{2,})", re.M)
print(regex.findall(log_text))

Вывод

[('12345@email.com', '19290'), ('45678@email.com', '23625')]
1 голос
/ 27 октября 2019

Я думаю, вы немного усложнили Regex, попробуйте это:

RE_PATTERN = re.compile(r'Account\s(?P<Account>.+?\.com).*?High Score = (?P<Score>\d+)', re.DOTALL)

#  read the entire the log as a text 
for match in RE_PATTERN.finditer(log.read()):
    print(match.group('Account'))
    print(match.group('Score'))

Использование re.DOTALL, . будет соответствовать \n, поэтому .*? будет потреблять что-либо до слова High Score = найдено.

1 голос
/ 27 октября 2019

Вы можете попробовать упрощенную версию своего регулярного выражения: Category2-{25}\n.+Account\s+(.+)[\s\S]+?High Score = (.+)

Account\s+(.+) - будет соответствовать Account и одному или нескольким пробелам, поэтому будет соответствовать до адреса электронной почты, а затем будет соответствовать всемудо новой строки (т.е. всего адреса электронной почты) и сохраните его в группе захвата.

Еще одно изменение - [\s\S]+?, которое соответствует КАЖДОМУ символу, одному или нескольким, не жадным, до совпадения High Score. Затем он сопоставляет и сохраняет во второй группе захвата счет (после знака равенства).

Демо

1 голос
/ 27 октября 2019
for line in log:
    data = regex.findall(line)

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

Ниже код должен работать нормально

import re
# Read the entire content from file into a variable
contents = open(r"log.txt", "r").read()
regex = re.compile("Category2-{25}\n.{51}(?P<Account>.{11}\.com).\.\.(?:$\n^.*){5}High Score = (?P<Score>\d{2,})", re.M)

# Find iter is like re.findall, just that it returns the captured regex group objects(Also that it returns a callable iterator, but thats not important to know here)
for match in regex.finditer(contents):
    print match.group('Account')
    print match.group('Score')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...