[Python-es] expresiones regulares

Hernan Martinez Foffani hernan en orgmf.com.ar
Jue Ago 1 12:16:11 CEST 2002


> > 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 :(

lo hizo así para que obtener los grupos.  si lo quieres mas simple
puedes usar .search() en vez de .match()

>>> a = re.compile("\(.*\)")
>>> b = a.search('linux or (sun and bsd)')
>>> b.start()
9
>>> b.end()
22
>>> b.group()
'(sun and bsd)'
>>>

como ya te recomendaron antes, si vas a procesar expresiones (que
contengan parentesis anidados, etc.) lo mejor es que hagas un
parser.  no trates de resolverlo con regexp, al principio parece
que avanzas pero luego te encontras con montones de situaciones
que no puedes resolver, por ejemplo, cuando recibes predicados con
errores de sintaxis.

>
> 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?

en ese caso agrega uno o dos grupos mas (antes y despues):

                        "(.*)\((.*)\)(.*)"
  antes del 1er '(' -----^..^
  dentro del 1er '(' ----------^..^
  despues del 1er '(' ---------------^..^

> .....
> 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:

lo dicho, si vas a procesar expresiones haz un parser.  vas a resolver
todas las posibilidades y combinaciones de una vez.

saludos,
-hernan





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