[pyar] regexp fun
Mauro Caceres
mauro.caceres en gmail.com
Lun Abr 3 22:45:30 ART 2017
Lo que dice Matias se produce porque estás usando el '*' que al ser greedy
se va al final del texto donde tenés un match. Una NO solucion, pero para
ver que si funciona podrias especificar un mínimo y máximo de repeticiones
del grupo
Disclaimer; lo estoy diciendo sin probar, como me suena y con un bebe en
brazo llorando
El lun., 3 abr. 2017 20:16, Javier Haramina <jharamina en gmail.com> escribió:
> A mi me parece que podes utilizar una función recursiva, que funciona muy
> bien para este tipo de estructuras. Ojo la limitante es el stack procedure
> call , si no son demasiados los datos te va a funcionar muy bien.
>
> Javier
>
>
>
> *De:* pyar [mailto:pyar-bounces en python.org.ar] *En nombre de *Matías
> Bellone
> *Enviado el:* lunes, 03 de abril de 2017 19:15
> *Para:* Python Argentina
> *Asunto:* Re: [pyar] regexp fun
>
>
>
> 2017-04-03 19:01 GMT-03:00 Marcos Dione <mdione en grulic.org.ar>:
>
>
> buenas, gente, les vengo a traer un puzzle. tengo cosas de la pinta:
>
> foo
> foo[bar]
> foo[bar][baz]
> foo[bar][baz][quux]
>
> si? y quiero obtener la secuencia de foo, bar, baz, o sea, la primer
> palabra y la secuencia de 'claves' (como si estuviera accediendo
> diccionarios). okei, regexp al rescat... mentira, me menda a pique:
>
> In [7]: import re
>
> In [10]: foo = re.compile('([a-z]+)(?:\[([a-z]+)\])*')
>
> In [11]: foo.match('foo').groups()
> Out[11]: ('foo', None)
>
> In [12]: foo.match('foo[]').groups()
> Out[12]: ('foo', None)
>
> In [13]: foo.match('foo[bar]').groups()
> Out[13]: ('foo', 'bar')
>
> In [14]: foo.match('foo[bar][]').groups()
> Out[14]: ('foo', 'bar')
>
> In [15]: foo.match('foo[bar][baz]').groups()
> Out[15]: ('foo', 'baz') # WHAT? ántá mi bar?
>
> In [16]: foo.match('foo[bar][baz][quux]').groups()
> Out[16]: ('foo', 'quux') # WHAAAAAAAAAAAAT?!?!?
>
> explico la regexp:
>
> capturar( uno_o_mas(cualquier_de('a-z')) ) + cero_o_mas('[' + capturar(
> uno_o_mas(cualquiera-de('a-z')) ) + ']')
>
> espero que se entienda, porque estoy haciendo un modulito que
> implementa justo eso (pero en inglés):
>
> https://github.com/StyXman/dinant
>
> se aceptan sugerencias, ideas, etc. ojo, muy probable termine
> implemnetando un parser con otra cosa, pero WTF!!!
>
>
>
> El módulo re de la stdlib sólo te mantiene la última captura de un grupo
> de captura repetido. Es parte de la forma en la que funciona el motor de
> regex subyacente.
>
>
>
> Para evitar ese problema, vas a tener que utilizar otra forma de captura.
> Por ejemplo, separar la regex en dos y después usar findall para capturar
> todos los posibles subdiccionarios o, directamente, utilizar el módulo
> regex que sí permite lo que estás queriendo hacer.
>
>
>
> Ejemplo: http://stackoverflow.com/a/9765390/1352026
>
>
>
> Saludos,
> Toote
>
>
> ------------------------------
> [image: Avast logo] <https://www.avast.com/antivirus>
>
> El software de antivirus Avast ha analizado este correo electrónico en
> busca de virus.
> www.avast.com <https://www.avast.com/antivirus>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170404/08e4e22f/attachment.html>
Más información sobre la lista de distribución pyar