Извлечь вхождение текста в скобках из текстового файла Python
Журнальный файл:
INFO:werkzeug:127.0.0.1 - - [20/Sep/2018 19:40:00] "GET /socket.io/?polling HTTP/1.1" 200 -
INFO:engineio: Received packet MESSAGE, ["key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}]
Я заинтересован в извлечении только текста из с в скобках, которые содержат ключевое слово "key"
и не все вхождения, которые соответствуют шаблону регулярных выражений снизу.
Вот что я пробовал до сих пор:
import re
with open('logfile.log', 'r') as text_file:
matches = re.findall(r'\[([^\]]+)', text_file.read())
with open('output.txt', 'w') as out:
out.write('\n'.join(matches))
Это выводит все вхождения, которые соответствуют регулярному выражению. Желаемый вывод в output.txt будет выглядеть так:
"key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}
1 ответ
Чтобы сопоставить текст в квадратных скобках, которые не могут иметь [
а также ]
внутри него, но должен содержать какой-то другой текст, может быть сопоставлен с [^][]
класс отрицанных персонажей.
То есть вы можете сопоставить весь текст в квадратных скобках с \[[^][]*]
, и если вам нужно сопоставить какой-то текст внутри, вы должны поместить этот текст после [^][]*
а затем добавить еще одно вхождение [^][]*
до закрытия ]
,
Вы можете использовать
re.findall(r'\[([^][]*"key"[^][]*)]', text_file.read())
Посмотрите демо Python:
import re
s = '''INFO:werkzeug:127.0.0.1 - - [20/Sep/2018 19:40:00] "GET /socket.io/?polling HTTP/1.1" 200 -
INFO:engineio: Received packet MESSAGE, ["key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}]'''
print(re.findall(r'\[([^][]*"key"[^][]*)]', s))
Выход:
['"key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}']