【问题标题】:Best way to parse this sequence?解析这个序列的最佳方法是什么?
【发布时间】:2020-06-28 08:18:38
【问题描述】:

我得到一个这样的字符串

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

并且必须得到这样的结果

EXAMPLETEST
EXAMPLEANOTHERPART1
EXAMPLEANOTHERPART2
EXAMPLEUNLIMITEDPOSSIBILITIESLIKE
EXAMPLEUNLIMITEDPOSSIBILITIESTHIS

因为可能有无限数量的嵌套,所以我很难记住以前的部分。你能指出我正确的方向吗?

非常感谢

【问题讨论】:

  • 你的规则是什么?读取字符串的顺序是什么(从左到右?从内到外?){}和;的作用是什么?
  • @jasonwong 抱歉,如果不清楚。左括号“{”的左侧部分与括号内的所有可能性连接在一起。这些选项用分号“;”分隔。一切都可以嵌套,没有上限。结果,我想获得所有可能的连接。希望能解决这个问题。
  • 您需要以某种方式解析括号。这个Q&A 可能会有所帮助。

标签: python python-3.x parsing formatting


【解决方案1】:

目标:把它变成一个字典。然后从字典中创建输出。

>>> 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 中 dict 和 set 的混合体。
让它看起来更像一本字典:

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

【讨论】:

  • 这不是最直接的事情,所以我无法自己解决。必须根据我的需要稍微更改正则表达式,但现在可以完美运行。谢谢!
  • 小心我的解决方案。这运行eval。对于不受信任的来源,它可能是危险的。恶意的人可以在这里注入他们的代码。此外,它不会检查原始文件格式的一致性。这是您可以用来扩展的东西。很高兴我能帮忙:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2019-09-16
  • 2017-04-04
  • 2010-09-14
  • 2020-04-10
  • 1970-01-01
  • 2016-10-27
相关资源
最近更新 更多