У вас есть контроль над форматом строки адреса? Например, сделать её так:
data.0.format
Было бы проще. Теперь по поводу самого парсинга. Вы можете написать две функции.
def parse_path(address):
# парсим адрес address и возвращаем список его фрагментов.
# пример: "['data'][0]['format']" -> ['data', 0, 'format']
# Думаю, что регулярные выражения вкупе с небольшой обвязкой могут помочь.
return path
def recursive_set(datastructure, path, value):
head, tail = path[0], path[1:]
if tail:
# есть ещё что делать дальше.
return recursive_set(datastructure[head], tail, value)
else:
# Дальше ползти некуда, завершаем рекурсию.
datastructure[head] = value
recursive_set(
{'data': ...},
parse_address("['data'][0]['format']"),
'doc'
)