expresión regular de Python de una fecha en algún texto

¿Cómo puedo encontrar tantos patrones de fecha como sea posible de un archivo de texto por python? El patrón de fecha se define como:

dd mmm yyyy ^ ^ | | +---+--- spaces 

dónde:

  • dd es un número de dos dígitos
  • mmm es el nombre del mes en inglés de tres caracteres (por ejemplo, enero, marzo y diciembre)
  • yyyy es un año de cuatro dígitos
  • Hay dos espacios como separadores.

¡Gracias!

Aquí hay una manera de encontrar todas las fechas que coincidan con tu patrón

 re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text) 

Pero después del comentario de WilhelmTell sobre su pregunta, también me pregunto si esto es lo que realmente estaba pidiendo …

Usa el módulo de calendario para darte un poco de conciencia global:

 date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(calendar.month_abbr[1:]) print date_expr print re.findall(date_expr, source_text) 

Para mí, esto crea un date_expr como:

 "\d{2} (:?Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}" 

Pero si cambio mi configuración regional utilizando el módulo de configuración regional:

 locale.setlocale(0, "fr") 

Ahora busco meses en francés:

 "\d{2} (?:janv.|févr.|mars|avr.|mai|juin|juil.|août|sept.|oct.|nov.|déc.) \d{4}" 

Hmm, esta es la primera vez que trato las abreviaturas de los meses en francés, es posible que necesite una limpieza:

 date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join( m.title().rstrip('.') for m in calendar.month_abbr[1:]) 

Ahora me sale:

 "\d{2} (?:Janv|Févr|Mars|Avr|Mai|Juin|Juil|Août|Sept|Oct|Nov|Déc) \d{4}" 

Y ahora mi script también se ejecutará para mis amigos galos, con muy pocos problemas.

(Puede que se pregunte por qué tuve que cortar la lista month_abbr de [1:]: esta lista comienza con una cadena vacía en la posición 0, de modo que si usa find () para buscar una abreviatura de un mes en particular, obtendrá un número del 1-12, en lugar de 0-11.)

— Pablo

Aquí hay un ejemplo un poco más completo. La expresión regular coincidirá con algo más que un valor de fecha válido. datetime.strptime no podrá analizar nada que no sea válido y generar un ValueError . Si se analiza la fecha, entonces tiene un objeto de datetime completo que le da acceso a una gran cantidad de funcionalidades.

 >>> from datetime import datetime >>> import re >>> dates = [] >>> patn = re.compile(r'\d{2} \w{3} \d{4}') >>> fh = open('inputfile') >>> for line in fh: ... for match in patn.findall(line): ... try: ... val = datetime.strptime(match, '%d %b %Y') ... dates.append(val) ... except ValueError: ... pass # ignore, this isn't a date ... 

Me imagino que esto se puede colapsar en un buen código apretado con comprensión si así lo desea.

Prueba esto:

 import re allmatches = re.findall(r'\d\d \w\w\w \d\d\d\d', "string to match") 

o puedes usar esto para completar

 date = re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s\d{2}:\d{2}', text) print date ['30 November 2010 14:20', '30 November 2010 14:24']