Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本文件中提取括号之间出现的文本_Python_Regex_Logfile Analysis - Fatal编程技术网

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

Python 从文本文件中提取括号之间出现的文本,python,regex,logfile-analysis,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”的文本,而不是从下面提取与正则表达式模式匹配的所有引用 以下是我

日志文件:

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的所需输出如下所示:


要匹配方括号内不能包含
[
]
但应包含其他文本的文本,可以与
[^][
否定字符类匹配

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

你可以用

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

输出:

['"key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}']

您想要提取的所有消息是否都包含“key”,或者这只是一个示例?可以为输出假设多少结构?是的,所需的提取消息将包含相同的关键字“key”。至于输出结构,它应该包含上面示例日志文件片段中方括号内的所有文本。如果
“key”,请尝试
print(re.findall(r'\[([^][]*“key”[^][]*)],text_file.read())
可以出现在方括号内的任何地方。然后您可以将要查找的正则表达式的这一部分变成:
re.findall(r'\[“key”([^\]]]+'),text_file.read())
。这就是你要找的吗?@JohanL我试过了,但似乎不起作用,尽管方向是对的。谢谢你的回复!谢谢这工作做得很好!只是为了详细说明一种通用方法,以匹配具有key1或key2的实例。matches=re.findall(r'[([^][]*“key.[^][]*)]],text_file.read())@spinState010它可能是
键[12]
键\d+
而不是
键。
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"...}}']