Welchen regulären Ausdruck verwende ich in Python, um Datumsangaben wie "11/12/98" abzugleichen?
Anstelle des regulären Ausdrucks ist es im Allgemeinen besser, die Zeichenfolge als datetime.datetime
-Objekt zu analysieren:
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)
Sie können dann auf Tag, Monat und Jahr (und Stunde, Minuten und Sekunden) als Attribute des datetime.datetime
-Objekts zugreifen:
In [143]: date.year
Out[143]: 1998
In [144]: date.month
Out[144]: 11
In [145]: date.day
Out[145]: 12
Um zu testen, ob eine durch Schrägstriche getrennte Folge von Ziffern ein gültiges Datum darstellt, können Sie einen try..except
-Block verwenden. Ungültige Daten führen zu einer 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'
Wenn Sie eine längere Zeichenfolge nach einem Datum suchen müssen, können Sie mit Regex nach Ziffern suchen, die durch Schrägstrich getrennt sind:
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'
Natürlich stimmen auch ungültige Daten überein:
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'
Um zu überprüfen, ob match.group(1)
eine gültige Datumszeichenfolge zurückgibt, können Sie sie wie oben gezeigt mit datetime.datetime.strptime
analysieren.
Ich finde, dass die unten stehende RE für Date im folgenden Format funktioniert.
Es kann Jahr von 2000-2099 akzeptieren
Bitte vergessen Sie nicht, $ am Ende hinzuzufügen, wenn nicht der 14-11-201 oder 20177 akzeptiert wird
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()
output = '13 -11-2017 '
Mit diesem regulären Ausdruck können Sie verschiedene Arten von Datums-/Uhrzeit-Samples überprüfen.
^\d\d\d\d/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$
-> bestätigen Sie dies: 2018/7/12 13:00:00
für Ihr Format können Sie es ändern:
^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[0-2])/\d\d$
-> bestätigt dies: 11/12/98
Nun, aus meinem Verständnis bevorzuge ich einfach diesen regulären Ausdruck:
pattern='[0-9|/]+'
um das Format strenger anzupassen, funktioniert Folgendes:
pattern='(?:[0-9]{2}/){2}[0-9]{2}'
Ich kann der Antwort von unutbu persönlich nicht zustimmen, da wir manchmal reguläre Ausdrücke für "Finden" und "Extrahieren" verwenden, nicht nur "Validieren".