Expresiones regulares

Hernán Martínez Foffani hernan en orgmf.com.ar
Mie Mayo 18 11:49:52 CEST 2005


> Con lo de contruir las expresiones no se muy bien a que te refieres.
> Yo utilizo la libreria de python re.
> Ejemplo:
>
>        expr="<b>.+</b>"
>        mi_expr=re.compile (expr)

Me refiero a que no dices mucho de cómo estás usando las expregs.
No se qué problemas estás teniendo:

  >>> import re
  >>> expr="<b>.+</b>"
  >>> mi_expr=re.compile (expr)
  >>> mi_expr.findall("bla bla ... <b>pepe</b> blah blah")
  ['<b>pepe</b>']
  >>> mi_expr.findall("etc<tr><td>xx</td><td>yyy</td></tr>")
  []
  >>>

> En cuanto a si considero que pueden haber etiquetas anidadas y eso
> pues la verdad todavia no me lo habia planteado. La idea era coger
> toda la linea y trabajar con ella luego eliminando todas las
> etiquetas que supuestamente estan contenidas entre los caracteres "<"
> y ">" para quedarme solamente con las palabras.

Un ejemplo del problema de glotoneria:

  >>> mi_expr.findall("...<b>pepe</b>juana<b>choli</b>...")
  ['<b>pepe</b>juana<b>choli</b>']

Un ejemplo del problema de anidacion (que en el fondo es lo mismo):

  >>> mi_expr.findall("...<b>pepe<i>choli</i></b>...")
  ['<b>pepe<i>choli</i></b>']

Aunque al final logres separar pepe, choli y juana no obtendrás ninguna
relación válida entre los contenidos y los tags buscados.

> Lo de los intro y espaciones en blanco supuestamente tambien esta
> tomado en consideracion en las expresiones anteriores pues el signo
> "." incluye tambien los caracteres "\r \n" que es el de intro y todos
> los demas

Pues va a ser que no ;-)

  >>> mi_expr.findall("bla bla ... <b>pepe\n</b> blah blah")
  []
  >>>

Si procesas línea a línea como dices en el primer párrafo, no podrás
incluir los saltos de línea (uno excluye lo otro).  Si procesas todo
el contenido junto como un string, tienes que especificar que
usarás MULTILINE (lee la doc)

> Y, diculpando mi ignorancia, ¿que es un parse html? ¿Donde puedo
> encontra manuales para que me enseñen a usarlo?

<concepto resumido y algo drástico>
html es un lenguaje y como tal tiene una gramática.  Para procesar
una gramática necesitas un analizador sintáctico (un parser), no
es posible hacerlo bien con uno léxico (expresiones regulares)
</concepto>

La biblioteca estandar de Python incluye uno (HTMLParser)
El inconveniente es que no puede procesar javascript
embebido (habría que quitarlo antes) y que la gramática es estricta
(un navegar puede aceptar html con errores, este parser no)
El segundo problema se podría resolver "limpiando" la página
antes de procesarla (podrías usar Tidy http://utidylib.berlios.de/)

> Si este camino que tomo es muy complicado ¿alguien me puede indicar
> otra manera de hacer los mismo mas facil?

Depende del resultado que quieras lograr.  Con expresiones regulares
obtendrás algo sin demasiadas complicaciones pero seguramente será
incompleto y quizás hasta erróneo.
Aun así a lo mejor te es suficiente...

-H.




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