解析此序列的最佳方法是什么?

4
我收到一个像这样的字符串
EXAMPLE{TEST;ANOTHER{PART1;PART2};UNLIMITED{POSSIBILITIES{LIKE;THIS}}}

并且需要得到如下结果:

EXAMPLETEST
EXAMPLEANOTHERPART1
EXAMPLEANOTHERPART2
EXAMPLEUNLIMITEDPOSSIBILITIESLIKE
EXAMPLEUNLIMITEDPOSSIBILITIESTHIS

由于可能存在无限嵌套,我很难记住之前的部分。你可能能够指导我去正确的方向吗?

非常感谢。


你们的规则是什么?读取字符串的顺序是什么(从左到右?从内到外?){}和;的功能是什么? - wong.lok.yin
@jasonwong 抱歉如果之前没有表述清楚。大括号“{”左侧的部分将与括号内所有可能性连接在一起。这些选项用分号“;”分隔。所有内容都可以嵌套,并且没有上限。因此,我想获得每种可能的连接方式。希望这样能够澄清问题。 - TheInovat
你需要解析括号。这个问答可能会有所帮助。 - AnsFourtyTwo
1个回答

5
目标:将其转换为字典。然后从字典创建输出。
>>> string = "EXAMPLE{TEST;ANOTHER{PART1;PART2};UNLIMITED{POSSIBILITIES{LIKE;THIS}}}"
>>> string = string.replace(";", ",").replace("{", ": {")
>>> string
'EXAMPLE: {TEST,ANOTHER: {PART1,PART2},UNLIMITED: {POSSIBILITIES: {LIKE,THIS}}}'

EXAMPLETESTANOTHER是字符串,但它们没有用引号 ""'' 括起来。

使用正则表达式解决这个问题:

>>> 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

这不是最直接的事情,所以我自己无法弄清楚。为了满足我的需求,我不得不稍微改变一下正则表达式,但现在完美地工作了。谢谢! - TheInovat
请注意我的解决方案。它运行了一个 eval。对于不受信任的来源,这可能是危险的。恶意人员可能会在此处注入他们的代码。此外,它没有检查原始文件格式是否符合规范。这是你可以扩展的内容。很高兴我能帮到你 :-) - Tin Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接