2012-05-22 8 views
5

Hola, he escrito regex para verificar dónde tiene el texto el carácter "o". o/o: o AM o PM o espacio. Las expresiones regulares de follworig funcionan para eso, pero quiero que el caso falle si la cadena contiene el carácter que no sea AMP. import reRegex para verificar la fecha

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: Validar ({ 'Fecha': '12122010'}) Fecha 12122010 Falso (Contar con las falsas)

Cómo pude encuentra que la cadena tiene alguna sugerencia que no sea el char APM. Muchas gracias.

+0

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

+0

@ möter En resumen, solo asumiendo que la cadena está basada en la fecha -or/or: oAMP o espacio de caracteres presente en la cadena – Shashi

Respuesta

1

seguirlo:

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

Los cambios en la expresión regular son

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

Ahora la expresión regular básicamente lee como lista de símbolos que se permiten en 1 líneas

Si desea que la cadena vacía no coincide continuación, cambie el * a a +

+0

+1 Gracias @buckely la expresión regular funciona para capturar al char distinto de AMP pero si proporcionamos el Validar ({'Fecha': '12122010'}) debería fallar – Shashi

+0

¿Por qué debería fallar? Pude leer la fecha 1212-20-10 como Año 1212 día 20 mes 10 que es válida. Acordó que yyyyddmm es un formato extraño, pero ¿ahora está diciendo 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 quieres apoyar. – buckley

+0

@buckley que fue una especie de subtexto en esta pregunta. Para _validar_ ... – XORcist

1

Se podría utilizar una expresión como esta en su lugar:

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

^ y $ ancla 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 $).

+0

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

+0

+1 @Gracias Qtax el trabajo de expresiones regulares perfecto para capturar el carácter distinto de AMP pero si proporcionamos el Validate ({'Fecha': '12122010'}) debería fallar - Shashi – Shashi

+0

@ möter, sí, incluso ':: : ', pero nadie dijo nunca que esta expresión intente validar las fechas. (; – Qtax

1

La forma de abordar esto es demasiado ingenuo para manejar entradas confusas como '-30/A-MP/2012/12', '-30/A-MP/20PA12/12'.

Si desea validar las fechas robusta, ¿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) 

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

1

Tipo de elaborado, pero 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'}) 
+0

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

+0

@ möter, de ejemplos de OP es claro que su (s) fecha (s) no intercambiarán el día/mes/año, por lo que su segunda muestra no es emisora. Para la primera, podemos capturar el separador y usarlo en la expresión regular de validación si OP siente que un problema. – tuxuday

Cuestiones relacionadas