2012-05-22 9 views
5

Ciao ho scritto regex per controllare dove la stringa ha il carattere come - o. o/o: o AM o PM o spazio. Il suffworig regex funziona per quello ma voglio far fallire il caso se la stringa contiene il carattere diverso da AMP. import reRegex per controllare la data

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) 

uscita:

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) 

Modificato: Convalida ({ 'Data': '12.122.010'}) Data 12.122.010 False (Expecting Falso)

Come potrei trovare la stringa ha altro che l'APM char qualsiasi suggerimento. Grazie mille.

+0

Stai chiedendo come acquisire la stringa della data, escludendo "AM", "PM"? – XORcist

+0

@ möter In breve, solo supponendo che la stringa sia data in base al -or/o: orAMP o spazio presente nella stringa – Shashi

risposta

1

dare una prova:

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

Le modifiche al tuo regex sono

  • E 'ancorato con^e $ che significa che l'intera linea dovrebbe corrispondere e non parzialmente
  • la \ d viene aggiunto alla classe di caratteri per consentire le cifre

Ora la regex si legge sostanzialmente come elenco di simboli che sono ammessi su 1 linee

Se si desidera che la stringa vuota non corrisponde quindi modificare il * ad un +

+0

+1 Grazie @buckely la regex funziona perfettamente per catturare il carattere diverso da AMP ma se forniamo il valore Validate ({'Date': '12122010'}) dovrebbe fallire – Shashi

+0

Perché dovrebbe fallire? Potrei leggere la data 1212-20-10 come Anno 1212 giorno 20 mese 10 che è valida. Concordato che yyyyddmm è un formato strano ma stai dicendo che non dovremmo solo controllare il modulo ma anche controllare che il contenuto sia una data valida?Quindi la domanda diventa quali formati vuoi supportare. – buckley

+0

@buckley era una sorta di sottotesto in questa domanda. Per _validare_ ... – XORcist

1

Si potrebbe usare un'espressione come questo, invece:

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

^ e $ ancorano l'espressione all'inizio e alla fine della stringa, assicurandosi che non vi sia nient'altro (tranne una nuova riga opzionale dopo $).

+0

Una stringa di data "valida" sotto questa regex sarebbe: '-30/A-MP/2012/12'. – XORcist

+0

+1 @Grazie Qtax la regex funziona perfettamente per catturare il carattere diverso da AMP, ma se forniamo il Validate ({'Date': '12122010'}) dovrebbe fallire - Shashi – Shashi

+0

@ möter, sì, anche ':: : ', ma nessuno ha mai detto che questa espressione provi a convalidare le date. (; – Qtax

1

Il modo in cui ci si avvicina a questo è troppo ingenuo per gestire input confusi come "-30/A-MP/2012/12", "-30/A-MP/20PA12/12".

Se si desidera convalidare le date robusto, che ne dici:

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) 

Si dovrà definire tutti i formati possibili, ma si ottengono oggetti pieni datetime (o di tempo o di data oggetti, lavorano simili) e puoi essere assolutamente sicuro che siano validi. Per una spiegazione completa degli specificatori di formato disponibili: http://docs.python.org/library/time.html#time.strftime

1

Tipo di elaborato, ma fa il trucco.

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

Sotto questa espressione regolare, il 12-20/2011 sarebbe valido e il 2012-20-12 non lo sarebbe. – XORcist

+0

@ möter, da OP esempi è chiaro che la/le sua/e data/e non cambierà giorno/mese/anno, quindi il secondo campione non è un emittente, per il primo possiamo acquisire il separatore e utilizzarlo nella regex di convalida se OP ritiene che un problema. – tuxuday

Problemi correlati