Реализовать функцию для разбора строки, содержащей данные в текстовом формате
Реализовать функцию для разбора строки, содержащей данные в текстовом формате. Изучить детали формата по приведенным ниже примерам. Результат вернуть в виде словаря.
Пример 1
Входная строка:
do {{ local{ #-5628 ; #2071; #-5261 ;#3063} ==> @"lais_806"; }}. {{
local { #-9793 ; #-8719 ; #-6854 } ==> @"esorte"; }}. end
Разобранный результат:
{'lais_806': [-5628, 2071, -5261, 3063],
'esorte': [-9793, -8719, -6854]}
Ответы (2 шт):
Можно реализовать функцию parse_data_string, которая будет принимать входную строку и возвращать словарь с разобранными данными:
def parse_data_string(data_string):
result = {}
start_index = data_string.find('{{')
end_index = data_string.find('end')
while start_index != -1 and end_index != -1:
# разбираем блок данных между {{ и }}
block = data_string[start_index + 2:end_index]
label_index = block.find('==> @"')
label = block[label_index+6:block.find('";')]
values = []
for value in block[block.find('{')+1:block.find('}')].split(';'):
value = value.strip()
if value.startswith('#'):
values.append(int(value[1:]))
# добавляем разобранные данные в словарь
result[label] = values
# ищем следующие блоки данных
start_index = data_string.find('{{', end_index)
end_index = data_string.find('end', end_index+1)
return result
Пример использования:
data_string = 'do {{ local{ #-5628 ; #2071; #-5261 ;#3063} ==> @"lais_806"; }}. {{ local { #-9793 ; #-8719 ; #-6854 } ==> @"esorte"; }}. end'
result = parse_data_string(data_string)
print(result)
Результат выполнения:
{'lais_806': [-5628, 2071, -5261, 3063], 'esorte': [-9793, -8719, -6854]}
Тут делов то на пару регулярок. Знатоки регулярок может и в одну могут уложиться, но я не такой уж и знаток:
import re
item = re.compile('{{(.*?)==>.*?"([^"]+?)".*?}}')
num = re.compile('-?\d+')
string = 'do {{ local{ #-5628 ; #2071; #-5261 ;#3063} ==> @"lais_806"; }}. {{ local { #-9793 ; #-8719 ; #-6854 } ==> @"esorte"; }}. end'
print({y: num.findall(x) for x, y in item.findall(string)})
Вывод:
{'lais_806': ['-5628', '2071', '-5261', '3063'], 'esorte': ['-9793', '-8719', '-6854']}
Первая регулярка в основном состоит из "не жадных" произвольных фрагментов текста .*?, а остальное там - скобки, кавычки и прочее такое, между которыми мы хотим найти интересующие нас элементы.