2009-12-18 9 views
9

Angenommen, ich habe eine Zeichenfolge, die einige verschachtelte Listen darstellt, und ich möchte sie in die echte konvertieren. Ich konnte dies tun, denke ich:Wie analysiere ich eine Zeichenfolge, die eine verschachtelte Liste darstellt, in eine tatsächliche Liste?

exec "myList = ['foo', ['cat', ['ant', 'bee'], 'dog'], 'bar', 'baz']" 

aber in einer Umgebung, wo die Benutzer möglicherweise die Zeichenfolge beliefern diese ausführen könnte/würde eine schlechte Idee sein. Hat jemand irgendwelche Ideen für einen ordentlichen Parser, der das Gleiche erreichen würde?

+0

+1 für das Wissen über diese Art von Dingen hat Risiken und fragt danach. –

Antwort

21
>>> import ast 
>>> mylist = ast.literal_eval("['foo', ['cat', ['ant', 'bee'], 'dog'], 'bar', 'baz']") 
>>> mylist 
['foo', ['cat', ['ant', 'bee'], 'dog'], 'bar', 'baz'] 

ast.literal_eval:

sicher einen Ausdruck Knoten oder eine Zeichenfolge, die einen Ausdruck Python auszuzuwerten. Die angegebene Zeichenfolge oder der Knoten darf nur aus folgenden folgenden Python-Literalstrukturen bestehen: Strings, Zahlen, Tupel, Listen, dicts, booleans und None.

Dies kann zur sicheren Auswertung Strings verwendet werden, die Python-Ausdrücke aus nicht vertrauenswürdigen Quellen, ohne die Notwendigkeit, sich um die Werte zu analysieren.

+0

+1 Import ast macht die Runden, gute Sachen! – jathanism

+0

Kühl. Erst letzte Woche habe ich eval() zum ersten Mal benutzt, aber as.literal_eval ist das, was ich wirklich wollte. Beachten Sie, dass ich eval verwendet habe, um einen Wert für eine Konfigurationsdatei zu analysieren, also vertrauenswürdige Daten, aber trotzdem ... – ddaa