Манипуляция строк: преобразование плоской строки в древовидный формат - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть это дерево:

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>

Но из-за обстоятельств мой питон увидит его в виде плоской строки:

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>

Примечание: isв основном случайная строка, которую я не знаю, что это такое.

Теперь довольно просто получить нужную строку, я просто делаю string.split(\n)[4].Хитрая часть:

  • родители (Active Mode и Passive Mode) могут быть перетасованы, так что Active Mode будет после Passive Mode
  • дети (Local (EU) и International (WW)) также могут быть перетасованы
  • Родитель может отсутствовать или ребенок может отсутствовать (поэтому есть вероятность, что Active Mode не существует, что означает, что я долженполучить что-то вроде None

Одним из возможных решений, о котором я подумал, было как-то преобразовать плоскую строку в многослойный словарь, список или json, но я не знаюкак мне это сделать?

1 Ответ

0 голосов
/ 16 сентября 2018

Я набросал некоторый код, однако он может быть опасным, поскольку в целом нет гарантии, что случайные строки в режимах не конфликтуют с заголовками и / или именами режимов:

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() заключается в отслеживании текущих режимов в локальных переменных mode и options. В то же время он сохраняет полный результирующий объект в out.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...