web-dev-qa-db-fra.com

Regex Python pour correspondre aux dates

Quelle expression régulière en Python est-ce que j’utilise pour faire correspondre des dates comme celle-ci: "11/12/98"?

33
clumpter

Au lieu d'utiliser regex, il est généralement préférable d'analyser la chaîne en tant qu'objet datetime.datetime:

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)

Vous pouvez alors accéder au jour, au mois et à l'année (et à l'heure, aux minutes et aux secondes) en tant qu'attributs de l'objet datetime.datetime:

In [143]: date.year
Out[143]: 1998

In [144]: date.month
Out[144]: 11

In [145]: date.day
Out[145]: 12

Pour vérifier si une séquence de chiffres séparés par des barres obliques représente une date valide, vous pouvez utiliser un bloc try..except. Les dates non valides déclencheront une 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'

Si vous devez rechercher une date dans une chaîne plus longue, vous pouvez utiliser regex pour rechercher des chiffres séparés par des barres obliques:

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'

Bien sûr, les dates non valides correspondront également à:

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'

Pour vérifier que match.group(1) renvoie une chaîne de date valide, vous pouvez ensuite l'analyser à l'aide de datetime.datetime.strptime comme indiqué ci-dessus.

41
unutbu

Je trouve que le RE ci-dessous fonctionne bien pour Date dans le format suivant; 

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

Il peut accepter l'année 2000-2099

S'il vous plaît ne pas oublier d'ajouter $ à la fin, sinon accepter 14-11-201 ou 20177

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()

sortie = '13 -11-2017 '

3
aditya Prakash

En utilisant cette expression régulière, vous pouvez valider différents types d’échantillons Date/Heure, il suffit d’un petit changement.

^\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])$ -> valider ceci: 2018/7/12 13:00:00

pour votre format, vous pouvez le changer en:

^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[0-2])/\d\d$ -> valide ceci: 11/12/98

Eh bien, si je comprends bien, je préfère cette expression régulière simplement pour faire correspondre ce format à une chaîne donnée:

pattern='[0-9|/]+'

pour correspondre au format de manière plus stricte, les travaux suivants:

pattern='(?:[0-9]{2}/){2}[0-9]{2}'

Personnellement, je ne peux pas être d'accord avec la réponse de unutbu car nous utilisons parfois des expressions rationnelles pour "trouver" et "extraire", pas seulement pour "valider".

0
J.Melody