2009-07-23 7 views
1

У меня есть эта строка:Tokenizing блоков кода в Python

[a [a b] [c e f] d] 

и я хочу список, как этого

lst[0] = "a" 
lst[1] = "a b" 
lst[2] = "c e f" 
lst[3] = "d" 

Моей текущей реализация, что я не думаю, что это элегантный/вещее это два рекурсивные функции (одно разделение с '[' , а другое с ']'), но я уверен, что это может быть сделано с использованием списков или регулярных выражений (но я не могу понять разумный способ сделать это).

Любые идеи?

ответ

4

На самом деле это действительно не рекурсивная структура данных, обратите внимание, что a и d находятся в отдельных списках. Вы просто разделяете строку над символами скобки и избавляетесь от некоторого пробела.

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

parse_str = '[a [a b] [c e f] d]' 
lst = [s.strip() for s in re.split('[\[\]]', parse_str) if s.strip()] 

>>>lst 
['a', 'a b', 'c e f', 'd'] 
1

Ну, если это рекурсивная структура данных, вам понадобится рекурсивная функция, чтобы ее легко перемещать.

Но Python действительно есть Tokenizer библиотека, которая может оказаться полезной: http://docs.python.org/library/tokenize.html

1

Если это рекурсивная структура данных, то рекурсия хорошо пересечь его. Однако, разбор строки для создания структуры не обязательно должен быть рекурсивным. Один из вариантов, как я хотел бы сделать это итеративный:

origString = "[a [a b] [c [x z] d e] f]".split(" ") 
stack = [] 
for element in origString: 
    if element[0] == "[": 
     newLevel = [ element[1:] ] 
     stack.append(newLevel) 
    elif element[-1] == "]": 
     stack[-1].append(element[0:-1]) 
     finished = stack.pop() 
     if len(stack) != 0: 
      stack[-1].append(finished) 
     else: 
      root = finished 
    else: 
     stack[-1].append(element) 
print root 

Конечно, это, вероятно, может быть улучшена, и он будет создавать списки списков списков ... строк, которые не то, что ваш пример разыскивается. Однако он обрабатывает произвольную глубину дерева.

+0

thx! это очень интересные решения! –