sábado, febrero 07, 2009

Regex

Hace unos días le explicaba a un amigo sobre regex. En los días posteriores me puse a pensar que las expresiones regulares fueron algo que no comprendí o utilizé cabalmente hasta que llegué a Python, además de poder meter comentarios.
Creo que los grupos nombrados, que proximamente estarán en la implementación de referencia (PRCE) fueron la kiler feature.
Hoy estaba limpiando unos TODOs de una aplicación que integra SqlAlchemy, PyQt y Twisted (todavía no es una WIP pero va tomando forma) y encontré la siguiente linea:

(?P<type>\w*)://
(?P<user>[\w]+):
(?P<pass>[\w\d]+)@
(?P<host>[\w]*):
(?P<port>[\w]+)\/
(?P<db>[\w]+)
Que básicamente paresea cosas TIPO_DB://USER:PASS@HOST/BASE
Que se convirtió en esta, mejorada:

(?P<type>\w{2,15})://    # Tipo de la base de datos

(?:

   (?:

       (?P<user>[\w\d]{1,50})

       (?::(?P<pass>[\w\d]{1,50}))?

       @

   )?

   (?P<host>[\w]*)

   (?::(?P<port>[\d]{3,5}))?

)?\/   # Puso user:pass@host

(?P<db>[\w]+) # Nombre de la base, siempre es obligatorio

(?:\?(?P<params>[\w]*(?:\=[\w\d]+)))? # Parametros extra





Si bien todavía le falta un poco, creo que quedó modificable e incluso se puede modificar más.
Intenté codificar lo mismo en ruby y php, pero no es trivial lograr la misma funcionalidad.
Que bueno es haber encontrado Python, lo único que lamento es no haberlo descubrido antes :)


Nota: Todo fue debugueado con Kodos, que es otra killer app, que en algún momento pienso pasar a PyQt4, ya que su layuot no es muy widescreen friendly.

No hay comentarios.: