[pyar] regexp fun
Matías Bellone
matiasbellone en gmail.com
Lun Abr 3 19:15:29 ART 2017
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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170403/9657b066/attachment.html>
Más información sobre la lista de distribución pyar