Лучший способ разобрать эту последовательность? - PullRequest
4 голосов
/ 17 марта 2020

Я получаю такую ​​строку

EXAMPLE{TEST;ANOTHER{PART1;PART2};UNLIMITED{POSSIBILITIES{LIKE;THIS}}}

и должен получить такой результат

EXAMPLETEST
EXAMPLEANOTHERPART1
EXAMPLEANOTHERPART2
EXAMPLEUNLIMITEDPOSSIBILITIESLIKE
EXAMPLEUNLIMITEDPOSSIBILITIESTHIS

Поскольку количество вложений может быть неограниченным, у меня проблемы вспоминая части раньше. Не могли бы вы указать мне правильное направление?

Большое спасибо

1 Ответ

5 голосов
/ 17 марта 2020

Цель: превратить его в диктовку. А затем создайте вывод из словаря.

>>> string = "EXAMPLE{TEST;ANOTHER{PART1;PART2};UNLIMITED{POSSIBILITIES{LIKE;THIS}}}"
>>> string = string.replace(";", ",").replace("{", ": {")
>>> string
'EXAMPLE: {TEST,ANOTHER: {PART1,PART2},UNLIMITED: {POSSIBILITIES: {LIKE,THIS}}}'

EXAMPLE, TEST, ANOTHER являются строками, но они не заключены в кавычки "" или ''.

Использование RegEx для решения этой проблемы:

>>> import re
>>> string = re.sub(r"(\w+)", r"'\1'", string)
>>> string
"'EXAMPLE': {'TEST','ANOTHER': {'PART1','PART2'},'UNLIMITED': {'POSSIBILITIES': {'LIKE','THIS'}}}"

Это по-прежнему недопустимый формат файла. Это не JSON. Это не диктат. Это смесь слова и набора в Python.
. Похоже на словарь:

>>> string = re.sub(r"'(\w+)',", r"'\1': None, ", string)
>>> string = re.sub(r"'(\w+)'}", r"'\1': None}", string)
>>> string
"'EXAMPLE': {'TEST': None, 'ANOTHER': {'PART1': None, 'PART2': None},'UNLIMITED': {'POSSIBILITIES': {'LIKE': None, 'THIS': None}}}"

Теперь превращаем его в Python объект:

>>> my_dict = eval('{' + string + '}')
>>> my_dict
{'EXAMPLE': {'TEST': None, 'ANOTHER': {'PART1': None, 'PART2': None}, 'UNLIMITED': {'POSSIBILITIES': {'LIKE': None, 'THIS': None}}}}

Теперь у вас есть обычный Python объект, который вы можете перебирать и манипулировать строками. Вы можете написать рекурсивную функцию, которая объединяет вашу строку:

>>> def create_output(dict_element, result):
...     if dict_element == None:
...         print(result)
...         return
...     for key, value in dict_element.items():
...         create_output(value, result + key)
...
>>> create_output(my_dict, "")
EXAMPLETEST
EXAMPLEANOTHERPART1
EXAMPLEANOTHERPART2
EXAMPLEUNLIMITEDPOSSIBILITIESLIKE
EXAMPLEUNLIMITEDPOSSIBILITIESTHIS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...