字符串操作:将扁平字符串转换为树状格式

时间:2018-09-16 11:40:56

标签: python json string tree format

我有这棵树:

Active Mode
   |___ Local (EU)
   |       |___ <Random String>
   |___ International (WW)
   |       |___ <Random String> (I want this random string!!!)
Passive Mode
   |___ Local (EU)
   |       |___ <Random String>
   |___ International (WW)
           |___ <Random String>

但是由于某些情况,我的python会将其视为扁平字符串:

Active Mode
Local (EU)
<Random String>
International (WW)
<Random String> (I want this random string!!!)
Passive Mode
Local (EU)
<Random String>
International (WW)
<Random String>

注意: 基本上是一个随机字符串,我不知道它是什么。

现在很容易得到我想要的行,我只要string.split(\n)[4]。棘手的部分是:

  • 可以改组父母(Active ModePassive Mode),以便Active Mode在之后{em> Passive Mode
  • 孩子(Local (EU)International (WW))也可以改组
  • 父母可能失踪或孩子可能失踪(因此很可能没有Active Mode,这意味着我应该得到类似None的东西

我想到的一种可能的解决方案是将扁平字符串转换为多层字典,列表或json,但是我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

我草绘了一些代码,但是由于通常不能保证模式内的随机字符串不会与标题和/或模式名称发生冲突,因此这可能很危险:

def parse(text):
    lines = text.split('\n')
    out = {}
    mode, options = None, None
    for l in filter(None, lines):
        if l.endswith(' Mode'):  # must be really careful here
            out[l] = out.get(l, {})
            mode = out[l]
            options = None
            continue

        # and here...
        if l.startswith('Local (') or l.startswith('International ('):
            mode[l] = mode.get(l, [])
            options = mode[l]
            continue

        options.append(l)

    return out

t = '''
Active Mode
Local (EU)
<Random String>
International (WW)
<Random String> (I want this random string!!!)
Passive Mode
Local (EU)
<Random String>
International (WW)
<Random String>
'''

print(parse(t))

parse()函数的想法是跟踪局部变量modeoptions中的当前模式。同时,它在out中维护了完整的结果对象。