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/

Responder a