Hola, Puedes hacer primero un split por la cadena "},{" eso te devolverá una lista iterable a la que puede, linea por linea, ir buscando la expresión \ "name\":"([\z\d]+)\".*\"value\"\:\"([\z\d]+)".
Quizas debas hacer algunos ajustes, pero creo que te funcionara. Por otra parte, quien te manda los datos, aparentemente es un sistema "juicioso" que manda los datos en formato JSON, puedes hacer una regex que te valide eso y de paso lo elimine: al principio: {"format":"JSON","result": y al final: ,"version":"1.0" el resultado aparente es una cadena con notacion de JSON la cual con la libreria de python la puedes parsear sin problemas y obtener todo lo que necesitas, sin que uses la regex exacta. Saludos y espero te sirva. On Tue, Jun 3, 2014 at 4:22 AM, Miguel Angel Rodriguez <maro...@gmail.com> wrote: > > Hola a todos, > > Estoy intentando parsear con Python una gran cadena que recibo en un > software de comunicaciones que estoy programando. > > La cadena que yo recibo es la siguiente: > > value_str = > {"format":"JSON","result":{"devices":[{"key":"SCGDE1BA:180340320","channels":[{"name":"PF","unit":"","meta":"PF","value":"1.000"},{"name":"P-WSpt","unit":"kW","meta":"P-WSpt","value":"935"}, > > {"name":"Vac","unit":"V","meta":"Vac","value":"217.5"},{"name":"Iac","unit":"A","meta":"Iac","value":"513.8"},{"name":"Pac","unit":"kW","meta":"Pac","value":"335.2"},{"name":"Qac","unit":"kV > > Ar","meta":"Qac","value":"-1.0"},{"name":"Sac","unit":"kVA","meta":"Sac","value":"335.1"},{"name":"Fac","unit":"Hz","meta":"Fac","value":"49.950"},{"name":"ErrNoFirst","unit":"","meta":"ErrNoFirst","value":"0"},{" > > name":"P-WModFailStt","unit":"","meta":"P-WModFailStt","value":"Off"},{"name":"P-WModStt","unit":"","meta":"P-WModStt","value":"Off"},{"name":"Dsc","unit":"","meta":"Dsc","value":"---"},{"name":"Firmware-9","unit":"","meta":"Firmware-9","value":" > "},{"name":"Cntry","unit":"","meta":"Cntry","value":"DE1"} > ,{"name":"Type","unit":"","meta":"Type","value":"SCG"},{"name":"Mode","unit":"","meta":"Mode","value":"Operation"},{"name":"Error","unit":"","meta":"Error","value":"---"}]}]},"version":"1.0" > > > Yo solo quiero quedarme con los name y value existente. > > LA forma en la que lo estoy intentando es la siguiente: > > for channel_str in re.findall("\"name\":\"[A-Za-z0-9\-. > ]+\",\"value\":\"[A-Za-z0-9\-. ]*\"",value_str): > d_value = re.findall("[A-Za-z0-9.\-]+",channel_str) > > Pero de esta forma no entra en el for. > > ¿Alguien me puede ayudar? > > Gracias y un saludo > > > > > > > -- > Miguel Ángel Rodríguez de Alba > 678304435 > maro...@gmail.com > > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Andres Marin Gomez
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/