[Python-es] Expresiones regulares

Miguel Angel Rodriguez marodal en gmail.com
Mar Jun 3 22:53:33 CEST 2014


Este es un ejemplo de lo que recibo:

{"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"


Quiero parsearlo para poder almacenar en unas variables que tengo los
values que aparecen en el JSON. De esta forma:

 Con la solucion con expresiones regulares en cada iteracion tengo lo
siguiente:
 d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del
meta),value,(valor del value)]

En esa iteracion hago lo siguiente:
if d_value[1] == "PF":
    mi_variable_PF = d_value[7]
if d_value[1] == "Fac":
   mi_variable_Fac = d_value[7]
.....

No necesito todos los values, solo los que corresponden a unos determinados
name.

Con la solucion con expresiones regulares tengo el siguiente bug:
Alguna veces en el json aparece  "unit":"". Es decir, la clave key no tiene
valor, por lo que no consigo


El 3 de junio de 2014, 22:40, Flavio Danesse <fdanesse en gmail.com> escribió:

> Si quieres pasame un string de ejemplo que esté completo y dime que hacer
> con los values y te escribo la solución.
>
>
> El 3 de junio de 2014, 17:38, Flavio Danesse <fdanesse en gmail.com>
> escribió:
>
> Lo que hago es tomar el string que tienes y guardarlo en un archivo como
>> texto plano pero luego lo cargo utilizando json con lo cual obtengo un
>> diccionario python. Para obtener las keys y values del diccionario solo
>> tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer
>> también diccionario.items() lo cual te da la pareja key:value.
>>
>> En todos los casos obtendrás lista de keys, values o items.
>>
>> Ahora bien, el primer obstáculo está salvado, que era pasar el string a
>> un diccionario donde tienes parejas key-value.
>>
>> El segundo obstaculo es hacer recursividad dentro del diccionario para
>> seguir hacia adentro de la estructura obteniendo los diccionarios internos.
>> No es tan complicado, puedes comenzar con algo como:
>>
>> for key in diccionario.keys():
>>     valor = diccionario[key]
>>     . . .  lo que quieras con el key y lo que quieras con value aca
>> importa que tipo de dato es el value, porque por lo que veo tienes listas,
>> diccionarios, string, etc, utiliza type(valor) para operar sobre ellos
>> según su tipo.
>>
>>
>>
>>
>> El 3 de junio de 2014, 17:13, Miguel Angel Rodriguez <marodal en gmail.com>
>> escribió:
>>
>> No entiendo que haces con archivo...
>>>
>>> Nunca he programado con json en python.
>>>
>>> ¿Como seria a partir de lo que indicas el parseo de los datos? Es decir,
>>> ¿Como seria el bucle que me iria dando el name y el value?
>>>
>>>
>>>
>>>
>>> 2014-06-03 22:08 GMT+02:00 Flavio Danesse <fdanesse en gmail.com>:
>>>
>>> Voto por lo correcto que sería así:
>>>>
>>>> import os
>>>> import json
>>>> import codecs
>>>>
>>>> text =
>>>> '{"format":"JSON","result":{"devices":[{"key":"SCGDE1BA:180340320", etc
>>>> . . .
>>>>
>>>> path = "/tmp/x.json"
>>>>
>>>> archivo = open(path, "w")
>>>> archivo.write(text)
>>>> archivo.close()
>>>>
>>>> archivo = codecs.open(path, "r", "utf-8")
>>>> diccionario = json.JSONDecoder("utf-8").decode(archivo.read())
>>>>
>>>>
>>>> El 3 de junio de 2014, 8:03, <gustavo en nodo50.org> escribió:
>>>>
>>>> ejecutando esto:
>>>>>
>>>>> #!/usr/bin/python3
>>>>> import re
>>>>> 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":"kVAr","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"'
>>>>>
>>>>> for channel_str in
>>>>> re.findall("\"name\":\"[A-Za-z0-9\-.]+\"",value_str):
>>>>>  for channel_str1 in
>>>>> re.findall("\"value\":\"[A-Za-z0-9\-.]+\"",value_str):
>>>>>   print ( channel_str + ";" + channel_str1 )
>>>>>
>>>>> me da esto:
>>>>>
>>>>> "name":"Cntry";"value":"335.2"
>>>>> "name":"Cntry";"value":"-1.0"
>>>>> "name":"Cntry";"value":"335.1"
>>>>> "name":"Cntry";"value":"49.950"
>>>>> "name":"Cntry";"value":"0"
>>>>> "name":"Cntry";"value":"Off"
>>>>> "name":"Cntry";"value":"Off"
>>>>> "name":"Cntry";"value":"---"
>>>>> "name":"Cntry";"value":"DE1"
>>>>> "name":"Cntry";"value":"SCG"
>>>>> "name":"Cntry";"value":"Operation"
>>>>> "name":"Cntry";"value":"---"
>>>>> "name":"Type";"value":"1.000"
>>>>> "name":"Type";"value":"935"
>>>>> "name":"Type";"value":"217.5"
>>>>> "name":"Type";"value":"513.8"
>>>>> "name":"Type";"value":"335.2"
>>>>> "name":"Type";"value":"-1.0"
>>>>> "name":"Type";"value":"335.1"
>>>>> "name":"Type";"value":"49.950"
>>>>>
>>>>>
>>>>> te vale?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> > 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
>>>>> > marodal en gmail.com
>>>>> > _______________________________________________
>>>>> > Python-es mailing list
>>>>> > Python-es en python.org
>>>>> > https://mail.python.org/mailman/listinfo/python-es
>>>>> > FAQ: http://python-es-faq.wikidot.com/
>>>>> >
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Python-es mailing list
>>>>> Python-es en python.org
>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> https://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>>
>>> --
>>> Miguel Ángel Rodríguez de Alba
>>> 678304435
>>> marodal en gmail.com
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> https://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
Miguel Ángel Rodríguez de Alba
678304435
marodal en gmail.com
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140603/4184efd3/attachment.html>


Más información sobre la lista de distribución Python-es