[pyar] regexp fun

Javier Haramina jharamina en gmail.com
Lun Abr 3 20:15:07 ART 2017


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



---
El software de antivirus Avast ha analizado este correo electrónico en busca de virus.
https://www.avast.com/antivirus
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170403/d1d51fed/attachment.html>


Más información sobre la lista de distribución pyar