2009-07-23 20 views
1

ich diese Zeichenfolge haben:Tokenizing Codeblöcke in Python

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

und ich möchte eine Liste wie diese

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

Meine aktuelle Implementierung, die ich glaube nicht elegant ist/pythonic zwei rekursive Funktionen (eine Spaltung mit '[' und die andere mit ']'), aber ich bin mir sicher, dass es mit List Comprehensions oder regulären Ausdrücken getan werden kann (aber ich kann keinen vernünftigen Weg, es zu tun).

Irgendwelche Ideen?

Antwort

4

Eigentlich ist dies wirklich nicht eine rekursive Datenstruktur, beachten Sie, dass a und d in separaten Listen sind. Sie teilen die Zeichenfolge einfach über die Klammerzeichen und entfernen etwas Leerstelle.

Ich bin sicher, dass jemand etwas sauberer finden, aber wenn man ein etwas Einzeiler wollen wie die folgenden sollten Sie nahe kommen:

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

Nun, wenn es eine rekursive Datenstruktur ist, werden Sie eine rekursive Funktion benötigen, um sauber zu navigieren.

Aber Python hat eine tokenizer Bibliothek haben, die nützlich sein könnten: http://docs.python.org/library/tokenize.html

1

Wenn es eine rekursive Datenstruktur ist, dann ist Rekursion gut überquere es. Allerdings, Parsen der Zeichenfolge zum Erstellen der Struktur muss nicht rekursiv sein. Eine alternative Art, wie ich es tun würde, ist iterative:

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 

Natürlich kann dies wahrscheinlich verbessert werden, und es wird Listen von Listen von Listen ... von Strings erstellen, das ist nicht genau das, was Ihr Beispiel gewollt. Es behandelt jedoch beliebige Tiefe des Baumes.

+0

thx! Das ist eine sehr interessante Lösung! –

Verwandte Themen