Hi, vielleicht hat schon jemand von euch dieses Problem gehabt und kann mir einen Tip oder Lösung geben. Ich habe einen String der in etwa so aufgebaut ist s='[["abc","abc",["abc","abc"],"abc"],["abc","abc",["abc","abc"],["abc",["abc","abc"]],"abc"],"abc"]' Den möchte ich nun in eine Liste konvertieren. Das einfachste ist wohl: l=eval(s) Was dann zu dem hier führt. [['abc', 'abc', ['abc', 'abc'], 'abc'], ['abc', 'abc', ['abc', 'abc'], ['abc', ['abc', 'abc']], 'abc'], 'abc'] Aber ich brauche eine Lösung ohne eval/exec. Hat da jemand etwas bei der Hand? -- -- Oliver Kurz _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo! Ich glaube, es ist nicht mit regulären Ausdrücken zu parsen, wegen der Verschachtelung der Listen. Du muss auf einen Parser zugreifen, vieles darüber (in Python) findest Du unter http://gnosis.cx/TPiP/ Du kannst auch auf den Python-Tokenizer (Modul tokenizer) zugreifen, ich weiss aber nicht, ob das unbedingt einfacher ist :-( Grüße, Tomek On Mon, 2004-03-08 at 17:24, Oliver Kurz wrote:
Hi,
vielleicht hat schon jemand von euch dieses Problem gehabt und kann mir einen Tip oder Lösung geben.
Ich habe einen String der in etwa so aufgebaut ist
s='[["abc","abc",["abc","abc"],"abc"],["abc","abc",["abc","abc"],["abc",["abc","abc"]],"abc"],"abc"]'
Den möchte ich nun in eine Liste konvertieren. Das einfachste ist wohl:
l=eval(s)
Was dann zu dem hier führt. [['abc', 'abc', ['abc', 'abc'], 'abc'], ['abc', 'abc', ['abc', 'abc'], ['abc', ['abc', 'abc']], 'abc'], 'abc']
Aber ich brauche eine Lösung ohne eval/exec. Hat da jemand etwas bei der Hand?
-- -- Oliver Kurz
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de -- Tomek Meka - <tmeka@gmx.net> ...................................................................... "It is impossible to speak in such a way that you cannot be misunderstood." (Karl Popper)
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Guten Tag, Tomek Meka wrote:
wegen der Verschachtelung der Listen.
Es hat zwar mit der Ursprungsfrage nichts zu tun, aber diese Begründung ist mE. nicht richtig. Jeffrey Friedl zeigt eine Lösung, und zwar in der zwoten Auflage seines Buches 'Reguläre Ausdrücke', Seiten 197, 198 der deutschen Ausgabe (O'Reilly, isbn 3-89721-349-4) In python könnte man zB. sagen: import re s = '[["abc","abc",["abc","abc"],"abc"],["abc","abc",["abc","abc"],["abc",["abc","abc"]],"abc"],"abc"]' def R(z) : return re.compile( '\[' + '(?:[^\[\]]|\[' * z + '[^\[\]]*' + '\])*' * z + '\]' ) def F(z, s) : return re.findall(R(z), s) def N(s, z = 0) : f_0, f_z = F(z, s), F(z + 1, s) if f_0[-1] == f_z[-1] : print f_z, '\n\n', R(z).pattern, '-> tiefe =', z else : N(s, z + 1) N(s) gruß werndt _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Nachtrag: Der Aufuf N(s) ist eigenartigerweise beim Übertragen der mail verrutscht. Er gehört natürlich nicht eingerückt. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hi Oliver,
vielleicht hat schon jemand von euch dieses Problem gehabt und kann mir einen Tip oder Lösung geben.
Nö, aber ich hab's grad mal geschrieben. Nicht ganz komplett, denn er meckert nicht bei parser('["abc",,,]') aber er merkt inkorrekte Klammerung. ciao - chris -- Christian Tismer :^) <mailto:tismer@stackless.com> Mission Impossible 5oftware : Have a break! Take a ride on Python's Johannes-Niemeyer-Weg 9a : *Starship* http://starship.python.net/ 14109 Berlin : PGP key -> http://wwwkeys.pgp.net/ work +49 30 89 09 53 34 home +49 30 802 86 56 mobile +49 173 24 18 776 PGP 0x57F3BF04 9064 F4E1 D754 C2FF 1619 305B C09C 5A3B 57F3 BF04 whom do you want to sponsor today? http://www.stackless.com/ s='[["abc","abc",["abc","abc"],"abc"],["abc","abc",["abc","abc"],["abc",["abc","abc"]],"abc"],"abc"]' class ParserError(Exception): pass def parser(txt): lis = st = [] q = False ob = None def put(ob): if ob is not None: lis.append(ob) for c in txt: if not q: if c == '[': st.append(lis) lis = [] elif c == ']': if lis is st: raise ParserError, 'unmatched "]"' put(ob) ob = lis lis = st.pop() elif c == ',': put(ob) ob = None elif c == '"': q = True ob = '' elif not c.isspace(): raise ParserError, 'unexpected "%c"' %c else: if c == '"': q = False else: ob += c if st: raise ParserError, 'unmatched "["' return ob assert parser(s) == eval(s) _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (4)
-
Christian Tismer -
Oliver Kurz -
Stephan.Werndt@t-online.de -
Tomek Meka