2017-02-03 164 views
0

我在Python中使用re.findall匹配日志文件的每一行,并从该行中提取json数据。下面是一个例子行:正则表达式只匹配完全匹配而不匹配

<134>1 2017-01-23T10:54:47.111-01:11 bla blabla - - <-- '{"jsondata": "1.0", "result": null, "id": 0}' 

而且我使用它的代码:返回此

for line in jsonlog: 
     json_marker = "<-- '{" 
     if json_marker in line: 
      #Extract whats between the single quotes on lines where a json is present 
      x = re.findall(r"(\'\{(.*?)\}\')", line) 

(是有两个):

[('\'{"jsondata": "1.0", "result": null, "id": 0}\'', '"jsondata": "1.0", "result": null, "id": 0')] 

但我需要它只返回json格式的该行的json数据:

{"jsonrpc": "2.0", "result": null, "id": 2530} 

当我把我的正则表达式为regex101,

\'\{(.*?)\}\' 

我得到

"jsondata": "1.0", "result": null, "id": 0 

'{"jsondata": "1.0", "result": null, "id": 0}' 

小组赛和全场比赛所以这告诉我的findAll将返回该组。我该如何解决这个问题以返回完整匹配,json对象?

回答

1

尝试使用正则表达式:

r"({.*?})" 

这应该采取 “{...}” S

log_line = 'sdgfjk fgkglhdfg <-- fdfsd dsdasds {"jsondata": "1.0", "result": null, "id": 0} dasdsad khfsldfg' 

print(re.findall(r"({.*?})", log_line)) 

这里中的所有内容是我的输出:

['{"jsondata": "1.0", "result": null, "id": 0}'] 
+0

这精美地工作。我可以通过访问list元素来访问json数据。谢谢! –