我正在查看具有以下格式的日志消息
datetime log_message_type message_type server {json_string}
因此每行用空格分隔,每行总是有相同的字段,最后有一个json字符串,json块内有各种字段。
我想过用简单的
做这件事with open('test.log', 'r') as f:
for x in f:
line = x.split()
datetime = line[0]
log_message_type = line[1]
message_type = line[2]
server = line[3]
json_string = line[4]
除非我的json字符串中有空格,否则这会有效。
{ "foo" : "bar" }
这样做会把我的json字符串拆分到空格处。有没有什么方法可以使用正则表达式或其他东西在空格上分割,直到我到达该行的“json string”部分,然后保留其余部分?我尝试过像
这样的事情line = re.compile(".*\s.*\s.*\s.*\s").split(x)
尝试根据json字符串部分之前的4个空格来解析行,但是我恐怕我对python中的正则表达式系统是如何工作的还不够了解。有人能帮我一把吗?
编辑:忘了提,我为此坚持使用python 2.7。
答案 0 :(得分:6)
限制拆分次数:
line = x.split(maxsplit=4)
>>> "a b c d my json expression".split(maxsplit=4)
['a', 'b', 'c', 'd', 'my json expression']
注意:python 2参数不同,你必须作为位置传递(也适用于python 3 BTW):
line = x.split(None,4)
答案 1 :(得分:5)
尝试这样的事情。正则表达式很快就会失控。
log_line = "datetime log_message_type message_type server {json_string}"
json_part = log_line.split(None, 4)[-1]
答案 2 :(得分:2)
如果你正在使用python 3,你可以利用extended iterable unpacking。
$this->id
答案 3 :(得分:1)
这样的事情怎么样?
line = "datetime log_message_type message_type server {json_string}"
re.search(r"(\S+) (\S+) (\S+) (\S+) {(\S+)}", line).groups()
输出:
('datetime', 'log_message_type', 'message_type', 'server', 'json_string')