it-swarm.com.de

Python-Regex zum Abgleichen von Datumsangaben

Welchen regulären Ausdruck verwende ich in Python, um Datumsangaben wie "11/12/98" abzugleichen?

33
clumpter

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.

41
unutbu

Ich finde, dass die unten stehende RE für Date im folgenden Format funktioniert. 

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

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 '

3
aditya Prakash

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".

0
J.Melody