Snippet para crear expresiones regulares facilmente

por | 28 diciembre, 2015

Dejo una clase sencilla que permite crear expresiones regulares complejas por partes. Algunas de las ventajas que ofrece esta clase son:

  • Re-utilización de porciones de regexps
  • Fácil mantenimiento
  • Re-definición de porciones de regexps
  • Mayor claridad

 

Acá está la clase:

 
import re

class recomp:
    """ReComp lets you build regular expressions easily and reuse them.
    """

    def __init__(self):
        self.__dict__['_dict'] = {}
        self.__dict__['_tags'] = re.compile('(?P<x>[^\\\\]?)\{\s*(?P<tagname>[a-zA-Z_][a-zA-Z_0-9]*)\s*\}')


    def __setattr__(self, name, value):
        if not isinstance(value, basestring):
            raise TypeError('Value is not an string: %r' % value)

        self._dict[name] = value


    def __getattr__(self, name):
 
        if name not in self._dict:
            raise AttributeError("recomp instance has no attribute '%s'" % name)

        def fn(mo):
            return mo.groupdict()['x'] + getattr(self, mo.groupdict()['tagname'])

        return self._tags.sub(fn, self._dict[name])

Y el ejemplo que van a encontrar en el Gist:

from recomp import recomp
import re

#definition
r = recomp()
r.year = '[0-9]{2}'
r.month = '(?:0[1-9]|1[12])'
r.day = '(?:0[1-9]|[12][0-9]|3[01])'
r.date = '{day}\-{month}\-{year}'
r.hh = '(?:[01][0-9]|2[0-3])'
r.mm = '(?:[0-5][0-9])'
r.ss = '{mm}'
r.time = '{hh}\:{mm}\:{ss}'
r.datetime = '{date} {time}'

#print them
print r.mm
print r.date
print r.time
print r.datetime

#using re
print re.match(r.datetime, '27-12-15 21:08:15').group(0)

#redefine
r.year = '[0-9]{4}'
print re.match(r.datetime, '27-12-2015 21:08:15').group(0)

Link al Gist

-¿Que le dijo una expresión regular a otra?

-.+

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *