从文本文件Python中提取括号之间的文本

时间:2018-09-21 16:30:51

标签: python regex logfile-analysis

日志文件:

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 :(得分:1)

要匹配方括号内的文本,这些方括号内不能包含[],但应包含其他一些文本,可以使用[^][]否定字符类进行匹配。

也就是说,您可以将整个文本放在\[[^][]*]的方括号内,如果需要在其中匹配一些文本,则需要将该文本放在[^][]*之后,然后附加另一个[^][]*]

您可以使用

re.findall(r'\[([^][]*"key"[^][]*)]', text_file.read()) 

请参见Python demo

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