[Python-es] expresiones regulares

Attila Saorin mostroratas en yahoo.es
Jue Ago 1 11:47:01 CEST 2002


 --- Jose Alejandro Perez Rubio <perezj en si.uji.es> escribió: 
> No se si he entendido lo que preguntas, pero creo que esto te puede
> ayudar:
> 
> import re
> 
> # los paréntesis no escapados delimitan un grupo
> # al que luego accederemos mediante groups
>  
> a = re.compile( ".*\((.*)\).*" )      
> b = a.match( 'linux or (sun and bsd)')
> 
> print b.groups()[0]
> sun and bsd

Gracias, funciona :), pero no entiendo porque al escapar los parentesis los pones dos veces, es
decir, al si queremos escapar un parentesis ponemos delante '\' de el, entonces porque pones otro
parentesis despues? entiendo que es para que vea el parentesis que queremos emparejar, pero
entonces... para que lo escapamos antes? veo que funciona, pero no entiendo por que, con lo que no
sabria hacerlo para otro posible caso :(

alguno de los metodos del modulo 're' permite recuperar lo que hay antes del parentesis, es decir,
de lo que hemos sacado o simplemente lo recupero con un split o miro si has parentesis y cojo lo
de antes y despues?

> la cosa se complica, si lo que está entre paréntesis puede ser otros
> paréntesis, deberíamos plantearnos si las expresiones regulares son lo
> más adecuado. Si el problema es tan sencillo como se plantea
> inicialmente (solo coger lo que se encuentra entre paréntesis) quizá
> podría servir:
> 
> a = 'linux or (sun and bsd)'
> 
> p1 = a.find( '(' ) + 1
> p2 = a.rfind( ')' )
> 
> if p1 != -1  and  p2 != -1  and  p1 < p2 :
>   rdo = a[ p1 : p2 ]
> else 
>   rdo = ''
> 
> print rdo

tambien me queda claro y es sencillo, el problema de esto es que no veria los casos con dos o mas
bloque de parentesis, porque el find busca el primero y el rfind el ultimo, con lo que un ejemplo
como: '(sun or linux) and (www and http)' no funciona bien:

>>> l2
'(sun or linux) and (http and www)'
>>> p1 = l2.find ('(')+1
>>> p2 = l2.rfind(')')
>>> if p1 != -1  and  p2 != -1  and  p1 < p2 :
...     rto = l2[ p1 : p2 ]
... else:
...     rto = ''
... 
>>> print rto
sun or linux) and (http and www
>>> 

si funcionaria para anidados simples:

>>> l3='(sun or (linux and http))'
>>> p1 = l3.find ('(')+1
>>> p2 = l3.rfind(')')
>>> if p1 != -1  and  p2 != -1  and  p1 < p2 :
...     rto = l3[ p1 : p2 ]
... else:
...     rto = ''
... 
>>> print rto
sun or (linux and http)
>>> 

con lo que ya solo quedaria comprobar de nuevo si hay mas parentesis ;)

lo pongo por si acaso le sirve a alguien :)

Muchas gracias Jose Alejandro.

Attila

_______________________________________________________________
Yahoo! Messenger
Nueva versión: Webcam, voz, y mucho más ¡Gratis! 
Descárgalo ya desde http://messenger.yahoo.es


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