Re: [Python-es] Expresiones regulares
Hola, Supongo que no quieres utilizar json [1], no? [1] https://docs.python.org/2/library/json.html ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11: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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
como acabo de recibir el resto de correos que sugieren lo mismo que yo xD te recomiendo otra utilidad http://www.pythonregex.com/ con esa podras evaluar los resultados comodamente, ya que nadie excepto tu puede saber si la expresion es valida al no tener todos los posibles casos que te puedas encontrar. 2014-06-03 11:52 GMT+02:00 Guillermo Vaya nada...@gmail.com: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11: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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? ¿No creeis que casi está con la expresion regular que indiqué en mi primer correo? El 3 de junio de 2014, 11:52, Guillermo Vaya nada...@gmail.com escribió: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11: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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- 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/
Re: [Python-es] Expresiones regulares
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/
Re: [Python-es] Expresiones regulares
El 3 de junio de 2014, 11:56, Miguel Angel Rodriguez maro...@gmail.com escribió: En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? No es que sea complicado, sólo buscamos cómo trabajar menos, como los buenos informáticos. ¿No creeis que casi está con la expresion regular que indiqué en mi primer correo? Lo que veo de la expresión es que buscas name seguido inmediatamente de value, cosa que no ocurre. Prueba a separar los campos con algo así: '''name:(?Pname[\w\d\-. ]+).*?,value:(?Pvalue[\w\d\-. ]*)''' El 3 de junio de 2014, 11:52, Guillermo Vaya nada...@gmail.com escribió: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11: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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- 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/ -- Hyperreals *R Quarks, bits y otras criaturas infinitesimales: http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Muchisimas gracias por vuestras aportaciones. Al final lo he solucionado un poco a la fuerza bruta. for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\unit\:\[A-Za-z0-9\-. ]+\,\meta\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) ... En cada iteración, en d_value tengo un array de esta forma: [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)]. Solo tengo que acceder a esta array con los indices que me interesen para obtener lo que deseo. Se que no es la forma más optima, pero funciona perfectamente. Muchisimas gracias por todas vuestras aportaciones, sin duda este es el mejor grupo de programadores que existe. Saludos El 3 de junio de 2014, 12:38, Chema Cortes pych...@gmail.com escribió: El 3 de junio de 2014, 11:56, Miguel Angel Rodriguez maro...@gmail.com escribió: En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? No es que sea complicado, sólo buscamos cómo trabajar menos, como los buenos informáticos. ¿No creeis que casi está con la expresion regular que indiqué en mi primer correo? Lo que veo de la expresión es que buscas name seguido inmediatamente de value, cosa que no ocurre. Prueba a separar los campos con algo así: '''name:(?Pname[\w\d\-. ]+).*?,value:(?Pvalue[\w\d\-. ]*)''' El 3 de junio de 2014, 11:52, Guillermo Vaya nada...@gmail.com escribió: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11: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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- 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/ -- Hyperreals *R Quarks, bits y otras criaturas infinitesimales: http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- 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/
Re: [Python-es] Expresiones regulares
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 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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Hola, ¿Es siempre un json lo que recibes? Lo digo porque quizás puedes intentar decodificarlo como json ¿no? https://docs.python.org/2/library/json.html He comprobado la sintaxis de la cadena que pasas y es un formato válido de json: { 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 } A no ser que en otras ocasiones recibas otra cosas, lo que yo te recomendaría es que lo decodifiques y lo uses cono clave, valor. Espero que te ayude, un saludo! Un saludo -- *José Miguel Pérez Álvarez*, @jozemi http://twitter.com/jozemi Linkedin: http://es.linkedin.com/in/jozemi joz...@gmail.com On Tue, Jun 3, 2014 at 11: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/
Re: [Python-es] Expresiones regulares
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, gust...@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 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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
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 fdane...@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, gust...@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 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/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- 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/
Re: [Python-es] Expresiones regulares
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 maro...@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 fdane...@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, gust...@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 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ:
Re: [Python-es] Expresiones regulares
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 fdane...@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 maro...@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 fdane...@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, gust...@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
Re: [Python-es] Expresiones regulares
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 fdane...@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 fdane...@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 maro...@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 fdane...@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, gust...@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
Re: [Python-es] Expresiones regulares
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 obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: 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 fdane...@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 fdane...@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 maro...@gmail.com escribió: No entiendo que haces con
Re: [Python-es] Expresiones regulares
ok, dame unos minutos, me pongo en esto y te aviso. El 3 de junio de 2014, 17:55, Miguel Angel Rodriguez maro...@gmail.com escribió: 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 obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: 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 fdane...@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 fdane...@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
Re: [Python-es] Expresiones regulares
Hola, por lo que veo el json esta mal formado (o le falta una parte a la cadena), para poder parsearlo hay que eliminar la parte sobrante: import json # remover la parte sobrante json_string = json_string = string.replace(',version:1.0 ', '}') data = json.loads(json_string) # si la cadena tiene la misma estructura siempre puedes hacer esto channels = data[result][devices][0][channels] key_value = map(lambda a: a.items(), channels) con esto tienes una lista de listas con el formato [('value', valor_value), ('meta', valor_meta), ('name', valor_name), ('unit', valor_unit)] El 3 de junio de 2014, 15:55, Miguel Angel Rodriguez maro...@gmail.com escribió: 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 obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: 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 fdane...@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 fdane...@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á
Re: [Python-es] Expresiones regulares
Solucionado, dejo adjunto. El 3 de junio de 2014, 19:56, Jhonatan Sneider Salguero Villa sney2...@gmail.com escribió: Hola, por lo que veo el json esta mal formado (o le falta una parte a la cadena), para poder parsearlo hay que eliminar la parte sobrante: import json # remover la parte sobrante json_string = json_string = string.replace(',version:1.0 ', '}') data = json.loads(json_string) # si la cadena tiene la misma estructura siempre puedes hacer esto channels = data[result][devices][0][channels] key_value = map(lambda a: a.items(), channels) con esto tienes una lista de listas con el formato [('value', valor_value), ('meta', valor_meta), ('name', valor_name), ('unit', valor_unit)] El 3 de junio de 2014, 15:55, Miguel Angel Rodriguez maro...@gmail.com escribió: 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 obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: 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 fdane...@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 fdane...@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
Re: [Python-es] Expresiones regulares
2014-06-03 4:56 GMT-05:00 Miguel Angel Rodriguez maro...@gmail.com: En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? Se puede saber por qué? 2014-06-03 15:13 GMT-05:00 Miguel Angel Rodriguez maro...@gmail.com: Nunca he programado con json en python. No hay mejor razón para comenzar ahora ;) Saludos -- A menudo unas pocas horas de Prueba y error podrán ahorrarte minutos de leer manuales. ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] Expresiones regulares
Saludos a todos Debo extraer ciertos datos de un campo de texto los cuales pueden aparecer en cualquier parte de la cadena. Dicho datos son por ejemplo: 50 PALLETS, 10 CAJAS, etc. Estoy haciendo la siguiente expresion regular para buscarlo [0-9]*\s*[PALLET[S]|BULTO[S]|CAJA[S]|UNIDAD[ADES]|CARTON[ES]] Sin embargo no me funciona como espero. ¿Me podrían echar una mano? by: ISC. Manuel Alejandro Estévez Fernández ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Realmente no es tanto problema de python es que tu expresión regular esta mal formada. Te recomiendo leer algún tutorial de expresiones regulares. *import re* * * *pattern = re.compile(r([0-9]*)\s*(PALLETS|PALLET|BULTOS|BULTO|CAJAS|CAJA|UNIDADES|UNIDAD|CARTONES|CARTON)) * * * *assert pattern.match('50 PALLETS').groups() == ('50', 'PALLETS'), 'Fallo test 1'* *assert pattern.match('10 CAJAS').groups() == ('10', 'CAJAS'), 'Fallo test 2'* *assert pattern.match('1 CAJA').groups() == ('1', 'CAJA'), 'Fallo test 3'* *assert pattern.match('ZXVC') == None, 'Fallo test 4'* * * *print 'Paso todos los tests'* * * Adjunto un pequeño código, espero que te ayude. El 31 de mayo de 2013 17:58, Manuel A. Estevez Fernandez stvz...@gmail.comescribió: Saludos a todos Debo extraer ciertos datos de un campo de texto los cuales pueden aparecer en cualquier parte de la cadena. Dicho datos son por ejemplo: 50 PALLETS, 10 CAJAS, etc. Estoy haciendo la siguiente expresion regular para buscarlo [0-9]*\s*[PALLET[S]|BULTO[S]|CAJA[S]|UNIDAD[ADES]|CARTON[ES]] Sin embargo no me funciona como espero. ¿Me podrían echar una mano? by: ISC. Manuel Alejandro Estévez Fernández ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares: repeticiones de dos caracteres con longitud constante
¿Podría valerte este? ^A+B*$|^A*B+$ Tendrías que comprobar en un test aparte que la longitud del string es N 2012/8/22 Jesús Curbelo Rodríguez jescurb...@gmail.com Hola a todos, Me ha surgido una duda intentando crear una expresión regular. Supongamos que tenemos una lista de cadenas que cumplen las siguientes condiciones - La longitud de las cadenas es constante, digamos que de longitud N. - Las cadenas están formadas sólo por los caracteres A y B. - Los caracteres A siempre están alineados a la izquierda. - Los caracteres B siempre están alineados a la derecha. - Los caracteres A pueden aparecer J veces, siendo 0=J=N. - Los caracteres B pueden aparecer K veces, siendo 0=K=N. - J y K son distintos para cada cadena pero siempre se cumple J + K = N. - Ejemplos, para N=5: A, B, AAABB, AABBB, A, B (para N=5 no hay más posibilidades). Cuando N es pequeño podemos poner todas las opciones como alternativas, por ejemplo, para N=2 podemos usar la expresión A{2}|AB|BA|B{2} . Pero para valores mayores de N esta forma de proceder es inviable. ¿Alguien conoce una expresión regular que se pueda usar para cualquier valor de N? Gracias de antemano. Saludos. Jesús Curbelo. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Juan Ignacio Rodríguez de León Móvil: 605 890514 E-Mail: euriba...@gmail.com http://www.metriz.com/ http://descon2.com/ http://www.elornitorrincoenmascarado.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares: repeticiones de dos caracteres con longitud constante
El 22/08/2012 10:56, Juan Ignacio escribió: ¿Podría valerte este? ^A+B*$|^A*B+$ Tendrías que comprobar en un test aparte que la longitud del string es N 2012/8/22 Jesús Curbelo Rodríguez jescurb...@gmail.com mailto:jescurb...@gmail.com Hola a todos, Me ha surgido una duda intentando crear una expresión regular. Supongamos que tenemos una lista de cadenas que cumplen las siguientes condiciones * La longitud de las cadenas es constante, digamos que de longitud N. * Las cadenas están formadas sólo por los caracteres A y B. * Los caracteres A siempre están alineados a la izquierda. * Los caracteres B siempre están alineados a la derecha. * Los caracteres A pueden aparecer J veces, siendo 0=J=N. * Los caracteres B pueden aparecer K veces, siendo 0=K=N. * J y K son distintos para cada cadena pero siempre se cumple J + K = N. * Ejemplos, para N=5: A, B, AAABB, AABBB, A, B (para N=5 no hay más posibilidades). Cuando N es pequeño podemos poner todas las opciones como alternativas, por ejemplo, para N=2 podemos usar la expresión A{2}|AB|BA|B{2} . Pero para valores mayores de N esta forma de proceder es inviable. ¿Alguien conoce una expresión regular que se pueda usar para cualquier valor de N? Gracias de antemano. Saludos. Jesús Curbelo. ___ Python-es mailing list Python-es@python.org mailto:Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Juan Ignacio Rodríguez de León Móvil: 605 890514 E-Mail: euriba...@gmail.com mailto:euriba...@gmail.com http://www.metriz.com/ http://descon2.com/ http://www.elornitorrincoenmascarado.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ Hola Juan Ignacio, La idea era que N apareciese explícitamente en la expresión regular. Pero me temo que es imposible sólo con expresiones regulares así que la solución que propones debe ser la correcta. Gracias por tu tiempo y saludos. -- *Jesús Curbelo mailto:jescurb...@gmail.com /Quis custodiet ipsos custodes?/ * ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares: repeticiones de dos caracteres con longitud constante
El día 22 de agosto de 2012 12:11, Jesús Curbelo Rodríguez jescurb...@gmail.com escribió: La idea era que N apareciese explícitamente en la expresión regular. Pero me temo que es imposible sólo con expresiones regulares así que la solución que propones debe ser la correcta. ^(A|(B(?!A))){{{}}}$.format(N) -- Hyperreals *R: http://ch3m4.org/blog Quarks, bits y otras criaturas infinitesimales ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares por grupo
En Thu, 10 Feb 2011 14:42:36 +0100, lopz lowlife...@gmail.com escribió: El día 10 de febrero de 2011 04:50, Chema Cortes pych...@gmail.com escribió: Si sabes que los tres patrones de búsqueda van a ir en ése orden, se podrían encadenar: pat1=q=(.*?)[] pat2=(\d{4}-\d{2}-\d{2}) pat3=p class=text(.*?)/p pat=re.compile(.*?.join((pat1,pat2,pat3)), re.DOTALL) Dos comentarios: 1) activa el flag dotall para búsquedas multilíneas 2) te sobraba el carácter | en el primer patrón (por lo que comentabas) Sí, gracias por el tip, lo del caracterr | lo puse por or pero ahora que veo no es necesario jeje Peero sigo con la duda de que cómo sería en una sola expresión? cómo le digo que me coja desde q= hasta /p y lo que está en medio agrupar partes por grupos? ¿o es que esto no se puede? Te había respondido a tu pregunta: si juntas los tres grupos con .*? tendrás todo en una sóla expresión: (?s)q=(.*?)[].*?(\d{4}-\d{2}-\d{2}).*?p class=text(.*?)/p Pero te en cuenta que algún día tú u otro programador querrá modificar este código, así que ponlo lo más fácil posible. Por otro lado, tú mismo estás viendo que es mejor primero buscar un fragmento y luego trocearlo en grupos. Tal vez deberías hacer caso a tu instinto. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares por grupo
El día 10 de febrero de 2011 02:46, lopz lowlife...@gmail.com escribió: Sabría hacerlo por partes, primero un datos luego el otro y así, pero mi idea es hacerlo en una sola expresión y obtenerlo por grupos Igual es que ése es el modo, buscar cada patrón por separado. En general, el módulo re es bastante rápido como para que te preocupe hacer tres veces la búsqueda. Si sabes que los tres patrones de búsqueda van a ir en ése orden, se podrían encadenar: pat1=q=(.*?)[] pat2=(\d{4}-\d{2}-\d{2}) pat3=p class=text(.*?)/p pat=re.compile(.*?.join((pat1,pat2,pat3)), re.DOTALL) Dos comentarios: 1) activa el flag dotall para búsquedas multilíneas 2) te sobraba el carácter | en el primer patrón (por lo que comentabas) ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] Expresiones regulares por grupo
Hola Hace poco empecé son las expresiones regulares y estaba tratando de usarlas y tengo un pequeño problema al momento de parsear un html que extraigo de una página web, la idea es la siguiente, de un trozo de código html quiero extraer datos pero de diferentes líneas para esto hago uso de los grupos, mejor paso a pegar el trozo de código html y lo que intento extraer y lo que tengo hasta el momento h2Google search: a href=http://www.google.com/search?hl=en#038;q=BUSQUEDA#038;btnG=Google+Search; class=external rel=nofollowquot;BUSQUEDA/a/h2 palgo/p pfecha: 2006-03-06/p p class=textLINEA 1 LINEA 2 LINEA3/p /div Tengo esto y lo que quiero es obtener 3 datos de ahí, lo que dice BUSQUEDA, luego de la q= luego la fecha y por último LINEA 1, LINEA 2 y LINEA 3 Sabría hacerlo por partes, primero un datos luego el otro y así, pero mi idea es hacerlo en una sola expresión y obtenerlo por grupos lo que tengo hasta el momento es esto para obtener la palabra BUSQUEDA q=(.+?)[|] - esto me busca hasta que cierra comillas o hasta que se encuentre con que aveces está presente en medio y que a partir de ahí son parámetros que usa google para la fecha lo tengo así: (\d{4}-\d{2}-\d{2}) y para lo otro sería casi igual pero mi problema es que no se unirlas en una sola expresión jeje osea que en medio de esas incluya cualquier cosa como las etiquetas /h2 saltos de linea, tabs, etc Espero me puedan ayudar, desde ya muchas gracias saludOS! -- lopz es libre, usa -- GNU/linux gentoo +--[RSA 2048]--+ | ..o.o=+ | | o =o*.+ | | . . *oO . | | .EBoo | | o.S | +--[lopz.org]--+ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares por grupo
Opino lo mismo, y lxml en mi caso ha sido una herramienta maravillosa. Un saluso. El día 10 de febrero de 2011 07:12, Luis Miguel Morillas moril...@gmail.com escribió: El día 10 de febrero de 2011 02:46, lopz lowlife...@gmail.com escribió: Hola Hace poco empecé son las expresiones regulares y estaba tratando de usarlas y tengo un pequeño problema al momento de parsear un html que extraigo de una página web, la idea es la siguiente, de un trozo de código html quiero extraer datos pero de diferentes líneas para esto hago uso de los grupos, mejor paso a pegar el trozo de código html y lo que intento extraer y lo que tengo hasta el momento h2Google search: a href=http://www.google.com/search?hl=en#038;q=BUSQUEDA#038;btnG=Google+Search; class=external rel=nofollowquot;BUSQUEDA/a/h2 palgo/p pfecha: 2006-03-06/p p class=textLINEA 1 LINEA 2 LINEA3/p /div Tengo esto y lo que quiero es obtener 3 datos de ahí, lo que dice BUSQUEDA, luego de la q= luego la fecha y por último LINEA 1, LINEA 2 y LINEA 3 Sabría hacerlo por partes, primero un datos luego el otro y así, pero mi idea es hacerlo en una sola expresión y obtenerlo por grupos lo que tengo hasta el momento es esto para obtener la palabra BUSQUEDA q=(.+?)[|] - esto me busca hasta que cierra comillas o hasta que se encuentre con que aveces está presente en medio y que a partir de ahí son parámetros que usa google para la fecha lo tengo así: (\d{4}-\d{2}-\d{2}) y para lo otro sería casi igual pero mi problema es que no se unirlas en una sola expresión jeje osea que en medio de esas incluya cualquier cosa como las etiquetas /h2 saltos de linea, tabs, etc Espero me puedan ayudar, desde ya muchas gracias Yo no te puedo ayudar con la expresión regular. Sólo quería comentar que para hacer web scraping se suelen utilizar parsers de html o xml. En este caso un análisis del DOM resolvería el problema. Además te da más flexibilidad para sencillos cambios de la página inicial. -- luismiguel saludOS! -- lopz es libre, usa -- GNU/linux gentoo +--[RSA 2048]--+ | ..o.o=+ | | o =o*.+ | | . . *oO . | | .EBoo | | o.S | +--[lopz.org]--+ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- http://twitter.com/andsux http://www.niwi.be http://www.freebsd.org/ http://www.postgresql.org/ http://www.python.org/ http://www.djangoproject.com/ Linux is for people who hate Windows, BSD is for people who love UNIX Social Engineer - Because there is no patch for human stupidity ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/