2011-01-17 18 views

Respuesta

33

Se podría buscar dígitos separados por forward-barras:

In [146]: import re 
In [152]: match=re.search(r'(\d+/\d+/\d+)','The date is 11/12/98') 

In [153]: match.group(1) 
Out[153]: '11/12/98' 

Por supuesto, las fechas no válidas también coincidir:

In [154]: match=re.search(r'(\d+/\d+/\d+)','The date is 99/99/99') 

In [155]: match.group(1) 
Out[155]: '99/99/99' 

Se podría validar la fecha usando strptime (véase más adelante).


En lugar de utilizar expresiones regulares, se podría analizar en un objeto datetime.datetime, que es probablemente más útil:

In [140]: datetime.datetime.strptime("11/12/98","%m/%d/%y") 
Out[140]: datetime.datetime(1998, 11, 12, 0, 0) 

In [141]: datetime.datetime.strptime("11/12/98","%d/%m/%y") 
Out[141]: datetime.datetime(1998, 12, 11, 0, 0) 

In [143]: date.year 
Out[143]: 1998 

In [144]: date.month 
Out[144]: 11 

In [145]: date.day 
Out[145]: 12 

Para probar si una secuencia de dígitos separados por forward-barras representa una fecha válida , puede usar un bloque try..except. fechas inválidas elevarán un ValueError:

In [159]: try: 
    .....:  datetime.datetime.strptime("99/99/99","%m/%d/%y") 
    .....: except ValueError as err: 
    .....:  print(err) 
    .....:  
    .....:  
time data '99/99/99' does not match format '%m/%d/%y' 
+0

Lo siento, mi error, lo he probado contra 4 dígitos :) – Bronek

1

puedo encontrar el siguiente RE trabajar bien para la fecha en el siguiente formato;

  1. 14-11-2017
  2. 14.11.2017
  3. 14 | 11 | 2017

Puede aceptar año a partir de 2000-2099

Por favor, no se olvide para agregar $ al final, si no acepta 14-11-201 o 20177

date="13-11-2017" 

x=re.search("^([1-9] |1[0-9]| 2[0-9]|3[0-1])(.|-)([1-9] |1[0-2])(.|-|)20[0-9][0-9]$",date) 

x.group() 

salida = '13 -11-2017 '