Реализовать функцию для разбора строки, содержащей данные в текстовом формате

Рейтинг: -2Ответов: 2Опубликовано: 28.03.2023

Реализовать функцию для разбора строки, содержащей данные в текстовом формате. Изучить детали формата по приведенным ниже примерам. Результат вернуть в виде словаря.

Пример 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]}

Ответы

▲ 0Принят

Можно реализовать функцию 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]}
▲ 1

Тут делов то на пару регулярок. Знатоки регулярок может и в одну могут уложиться, но я не такой уж и знаток:

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']}

Первая регулярка в основном состоит из "не жадных" произвольных фрагментов текста .*?, а остальное там - скобки, кавычки и прочее такое, между которыми мы хотим найти интересующие нас элементы.