正则表达式仅匹配完全匹配而不匹配组

时间:2017-02-03 23:08:58

标签: python json regex findall

我在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 个答案:

答案 0 :(得分:1)

尝试使用此正则表达式:

r"({.*?})"

这应该包含&#34; {...}&#34; 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}']