Извлечь вхождение текста в скобках из текстового файла Python - PullRequest
0 голосов
/ 21 сентября 2018

Файл журнала:

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 Ответ

0 голосов
/ 21 сентября 2018

Чтобы сопоставить текст в квадратных скобках, который не может содержать [ и ] внутри него, но должен содержать какой-либо другой текст, может быть сопоставлен с [^][] классом символов с отрицанием.

То есть выможет сопоставить весь текст в квадратных скобках с \[[^][]*], и если вам нужно сопоставить некоторый текст внутри, вам нужно поместить этот текст после [^][]*, а затем добавить еще одно вхождение [^][]* перед закрывающим ].

Вы можете использовать

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"...}}']
...