从文本文件中提取括号内的文本 Python

3

日志文件:

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

你想要提取的所有消息都包含“key”吗,还是这只是一个例子?输出可以假定多少结构? - JohanL
如果 "key" 可以出现在方括号的任何位置,请尝试使用 print(re.findall(r'\[([^][]*"key"[^][]*)]', text_file.read())) - Wiktor Stribiżew
那么你可以将其作为正则表达式的一部分:re.findall(r'\["key"([^\]]+)', text_file.read())。这是你要找的吗? - JohanL
@JohanL 我尝试了那个方法,但好像没有起作用,虽然方向是对的。感谢您的回复! - spinState010
啊,你的“key”短语前面可能有一个*(在此处作为文本书写时会使其加粗)。如果您也想捕获它,那么应该是re.findall(r'\[\*"key"\*([^\]]+)', text_file.read()),或者您当然可以使用更一般的搜索“key”,就像接受的答案中所示。 - JohanL
显示剩余2条评论
1个回答

2

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

也就是说,你可以使用\[[^][]*]来匹配方括号内的整个文本,如果你需要匹配一些内部文本,则需要将该文本放在[^][]*之后,然后在关闭]之前附加另一个[^][]*的出现。

您可以使用

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

谢谢!这个完美地解决了问题!只是为了详细说明一下,我们可以使用一般化的方式来匹配当我们有 key1key2 的实例。matches = re.findall(r'[([^][]"key."[^][]*)]', text_file.read()) - spinState010
@spinState010 可能是 key[12]key\d+ 而不是 key - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接