Regex para comprobar la fecha

Hola, he escrito expresiones regulares para verificar dónde la cadena tiene el carácter como - o . o / o : o AM o PM o espacio . La siguiente expresión regular funciona para eso, pero quiero que el caso falle si la cadena contiene el carácter que no sea AMP . importar re

Datere = re.compile("[-./\:?AMP ]+")

FD = { 'Date' : lambda date : bool(re.search(Datere,date)),}

def Validate(date):

    for k,v in date.iteritems():
        print k,v
        print FD.get(k)(v)

Salida:

Validate({'Date':'12/12/2010'})
Date 12/12/2010
True
Validate({'Date':'12/12/2010 12:30 AM'})
Date 12/12/2010
True

Validate({'Date':'12/12/2010 ZZ'})
Date 12/12/2010
True  (Expecting False)

Editado: Validate({'Date':'12122010'}) Fecha 12122010 Falso (Esperando Falso)

¿Cómo podría encontrar la cadena que no sea el char APM alguna sugerencia? Muchas gracias.

preguntado el 22 de mayo de 12 a las 13:05

¿Está preguntando cómo capturar la cadena de fecha, excluyendo 'AM', 'PM'? -

@möter En resumen, solo suponiendo que la cadena es una fecha basada en -o/o: o AMP o carácter espacial presente en la cadena -

4 Respuestas

Prueba esto:

^[-./\:?AMP \d]*$

Los cambios en su expresión regular son

  • Está anclado con ^ y $, lo que significa que toda la línea debe coincidir y no parcialmente
  • el \d se agrega a la clase de caracteres para permitir dígitos

Ahora la expresión regular básicamente se lee como una lista de símbolos que están permitidos en 1 línea

Si desea que la cadena vacía no coincida, cambie el * a un +

contestado el 22 de mayo de 12 a las 13:05

+1 Gracias @buckely, la expresión regular funciona perfectamente para capturar el carácter que no sea AMP, pero si proporcionamos Validate ({'Date': '12122010'}) debería fallar - Shashi

¿Por qué debería fallar? Podría leer la fecha 1212-20-10 como Año 1212 día 20 mes 10 que es válido. Estuvo de acuerdo en que aaaaddmm es un formato extraño, pero ¿está diciendo ahora que no solo debemos verificar el formulario sino también verificar que el contenido sea una fecha válida? Entonces la pregunta es qué formatos desea admitir. - Buckley

@möter validando la sintaxis o validando el significado? Aunque las expresiones regulares se pueden usar para distinguir las fechas existentes de las que no existen, no siempre es bonito. Las expresiones regulares se usan principalmente para validar la sintaxis, pero tal vez el OP pensó que eran más versátiles: Buckley

Podrías usar una expresión como esta en su lugar:

^[-0-9./:AMP ]+$

^ y $ ancle la expresión al principio y al final de la cadena, asegurándose de que no haya nada más en ella (excepto una nueva línea opcional después de $).

contestado el 22 de mayo de 12 a las 13:05

Una cadena de fecha "válida" debajo de esta expresión regular sería: '-30/A-MP/2012/12'. - XORcista

+1 @Thanks Qtax, la expresión regular funciona perfectamente para capturar el carácter que no sea AMP, pero si proporcionamos Validate ({'Date': '12122010'}) debería fallar - Shashi - Shashi

@möter, sí, incluso :::, pero nadie dijo nunca que esta expresión intenta validar fechas. (; - Qimpuesto

Creo que es bastante obvio considerando el código del OP. Y el título. - XORcista

La forma en que aborda esto es demasiado ingenua para lidiar con entradas confusas como '-30/A-MP/2012/12', '-30/A-MP/20PA12/12'.

Si desea validar sus fechas de manera sólida, ¿qué tal:

import datetime
date = '12-12-2012 10:45 AM'
formats = ("%d-%m-%Y %I:%M %p", "%d/%m/%Y %I:%M %p", ...)
for fmt in formats:
    try:
        valid_date = datetime.datetime.strptime(date, fmt)
    except ValueError as e:
        print(e)

Tendría que definir todos los formatos posibles, pero obtendrá objetos de fecha y hora completos (u objetos de hora o fecha, funcionan de manera similar), y puede estar absolutamente seguro de que son válidos. Para obtener una explicación completa de los especificadores de formato disponibles: http://docs.python.org/library/time.html#time.strftime

contestado el 22 de mayo de 12 a las 14:05

Tipo de elaborado, pero hace el truco.

import re
Datere = re.compile("""
    ^(?:\d\d[-./\:]){2} ## dd_SEP_dd
    \d{4}\s* ## year may be followed by  spaces
    (?:\d\d[-./\:]\d\d\s+(?:AM|PM))? ## hh_SEP_mm spaces followed by AM/PM and this is optional
    \s*$""",re.X)

FD = { 'Date' : lambda date : bool(re.search(Datere,date)),}

def Validate(date):

    for k,v in date.iteritems():
        print k,v
        print FD.get(k)(v)

print Validate({'Date':'12/12/2010'})
print Validate({'Date':'12/12/2010 12:30 AM'})
print  Validate({'Date':'12/12/2010 ZZ'})

contestado el 22 de mayo de 12 a las 14:05

Bajo esta expresión regular, 12-20/2011 sería válido y 2012-20-12 no lo sería. - XORcista

@möter, a partir de los ejemplos de OP, está claro que su(s) fecha(s) no intercambiarán lugares de día/mes/año. por lo que su segunda muestra no es un emisor. para el primero, podemos capturar el separador y luego usarlo en la expresión regular de validación si OP lo siente como un problema. - tuxuday

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.