Le but de ce post est de montrer comment vérifier qu’une date est valide.

import re
dates = ["19850722", "20040732", "19860622", "20191309"]
valid_date_regex = "\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])"

valid_dates = []
for date in dates:
    match = re.match(valid_date_regex, date)
    if match:
        valid_dates.append(date)
print(valid_dates) # ['19850722', '19860622']

Explications

  • \d: c’est pour rechercher un chiffre
  • \d{4}: on cherche 4 chiffres, ce qui donnera l’année
  • 0[1-9]|1[012]: capture le mois sur 2 chiffres
    • [1-9] capture un chiffre compris entre 1 et 9
    • [012] capture 0, 1 ou 2
    • a|b capture a ou b
  • 0[1-9]|[12][0-9]|3[01]: capture le jour sur 2 chiffres
    • 3 possibilités
    • le jour commençe par un 0 et suivi par les chiffres entre 1 et 9 ([1-9])
    • le jour commençe par un 1 ou un 2 ([12]) et suivi par les chiffres entre 0 et 9 ([0-9])
    • le jour commençe par un 3 et suivi par les chiffres 0 ou 1 ([01])

Remarques

Avec le regex précédent \d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]), on capture 2 groupes: le mois et le jour.

match = re.match(valid_date_regex, "19850722")
print(match.groups()) # ('07', '22')
print(match.string) # 19850722

Les parenthèses sont les éléments qui déterminent un groupe. Cette example contient 2 paires de parenthèses, il y a donc deux groupes. Les parenthèses sont obligatoires pour limiter l’expression.

Comment faire pour ne pas récupérer ces groupes ? Il suffit d’utiliser la syntaxe (?: ).

match = re.match("\d{4}(?:0[1-9]|1[012])(?:0[1-9]|[12][0-9]|3[01])", "19850722")
print(match.groups()) # ()
print(match.string) # 19850722

More Pythonic

On peut aussi utiliser la fonction filter

print(list(filter(lambda d: re.match(valid_date_regex, d), dates))) # ['19850722', '19860622']

Liens utiles