2017-02-03 11 views
0

Я использую re.findall в python для соответствия каждой строке файла журнала и извлечения данных 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"({.*?})" 

Это должно принять все содержимое в "{...}" с

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

Этот работал красиво. Я могу получить доступ к данным json, просто обратившись к элементу списка. Спасибо! –