2009-07-20 12 views
8

A menudo, me gustaría crear expresiones regulares complejas a partir de las más simples. La única forma en que estoy actualmente enterado de de hacer esto es a través de operaciones de cadena, por ejemplo .:Regexp compilable en Python

Year = r'[12]\d{3}' 
Month = r'Jan|Feb|Mar' 
Day = r'\d{2}' 
HourMins = r'\d{2}:\d{2}' 

Date = r'%s %s, %s, %s' % (Month, Day, Year, HourMins) 
DateR = re.compile(Date) 

Hay alguien consciente de un método diferente o un enfoque más sistemático (tal vez un módulo) en Python tener expresiones regulares componibles? Prefiero compilar cada expresión regular de forma individual (por ejemplo, para usar opciones de compilación individuales), pero ¡parece que ya no hay forma de componerlas !?

+0

La forma en que lo hace parece clara y concisa. Oh, por cierto, no necesitas la "r" en la cadena para tu variable 'Date'. –

+0

¿Python permite comentarios en expresiones regulares? –

+1

mmyers, sí. Cuando use la bandera re.VERBOSE, puede usar # para comentarios. –

Respuesta

1

usted podría utilizar de Ping rxb:

year = member("1", "2") + digit*3 
month = either("Jan", "Feb", "Mar") 
day = digit*2 
hour_mins = digit*2 + ":" + digit*2 

date = month + " " + day + ", " + year + ", " + hour_mins 

A continuación, puede hacer coincidir la fecha resultante directamente, o use

DateR = date.compile() 
+0

Parece la respuesta que estaba buscando, gracias. Tendré que comprobar cómo funciona el módulo sobre las opciones de compilación y los grupos de coincidencia, pero a primera vista se ve mejor :-). – ThomasH

4

Puede utilizar sintaxis de formato de Python para esto:

types = { 
    "year":   r'[12]\d{3}', 
    "month":  r'(Jan|Feb|Mar)', 
    "day":   r'\d{2}', 
    "hourmins": r'\d{2}:\d{2}', 
} 
import re 
Date = r'%(month)s %(day)s, %(year)s, %(hourmins)s' % types 
DateR = re.compile(Date) 

(. Tenga en cuenta el agregado agrupar en torno a Jan | febrero | Mar)

+0

Eso todavía depende de operaciones de cuerda, ¿no? – ThomasH

+1

¡¿Sí ?! (/ * relleno para evitar el sistema de comentarios tontos * /) –