Вы можете использовать re.split
разделить каждое вхождение }\W*{
при сохранении скобок, а затем преобразовать каждый элемент в результате с json.loads
:
import json
import re
s = '''{
"a":"1",
"b":"2"
}
{
"c":"3",
"d":"4"
}'''
res = [json.loads(g) for g in re.split(r'(?<=})\W*(?={)', s)]
print(res)
Выход:
[{'b': '2', 'a': '1'}, {'c': '3', 'd': '4'}]
В регулярном выражении выше (?<=})
- это положительное утверждение lookbehind, которое вызывает \W*
, чтобы соответствовать только в том случае, если ему сразу предшествует }
. Аналогично (?={)
- это положительное утверждение, которое требует {
, которое следует за \W*
.
Обновление В качестве альтернативы вы можете использовать re.finditer
для поиска совпадений вместо разделения строки. Она также будет работать в случае, когда нет никаких пробелов между объектами:
import json
import re
s = '''{
"a":"1",
"b":"2"
}{
"c":"3",
"d":"4"
}
{
"foo":"bar"
}'''
res = [json.loads(m.group(0)) for m in re.finditer(r'({.*?}\W*(?=({|$)))', s, re.DOTALL)]
print(res)
Выход:
[{'a': '1', 'b': '2'}, {'d': '4', 'c': '3'}, {'foo': 'bar'}]
Обратите внимание, что оба метода выше сломается, если ваш JSON имеет строку с } {
с любым количество пробелов между ними.
Я бы установил, как этот файл создан, чтобы сделать действительным JSON –
Это недопустимые объекты JSON, потому что между значениями нет запятой. – niemmi
@ cricket_007 извините, я забыл об этом! Я исправлю это сейчас – Guo