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)
-¿Que le dijo una expresión regular a otra?
-.+