Aller au contenu
M03 · C. Coder des solutions orientées objet

Utiliser les expressions régulières

Écrire un motif pour reconnaître un format de texte (téléphone, e-mail, code), et l'utiliser en Python pour valider, chercher, extraire et remplacer.

1Situer

Le formulaire d'inscription d'un club sportif à Oujda reçoit n'importe quoi : des téléphones à 9 chiffres, des e-mails sans @, des codes postaux avec des lettres. Vérifier chaque format avec des dizaines de if serait long et fragile. Une expression régulière décrit le format attendu en une ligne, et Python vérifie le reste.

2Comprendre

Comment une expression régulière vérifie un texte
MOTIF ^ 0 [67] \d{8} $ TEXTE 0 6 6 1 2 3 4 5 6 7 0 5 1 2 3 4 5 6 7 8 ✓ numéro valide ✕ 5 n'est ni 6 ni 7 : refusé

Le motif ^0[67]\d{8}$ décrit un mobile marocain. On le compare au texte 0661234567, morceau par morceau.

1 / 7

Une expression régulière (regex) est un motif qui décrit la forme d’un texte. En Python, on l’utilise avec le module re et on écrit le motif dans une chaîne brute r"..." pour que les \ ne soient pas interprétés.

Les briques d’un motif

SymboleSignificationExemple
\dun chiffre\d\d → 42
\wune lettre, un chiffre ou _\w+ → Salma_2
\sun espace
.n’importe quel caractère
[67]un caractère parmi la liste0[67] → 06, 07
[A-Z]une lettre de A à Z
{n} / {n,m}exactement n / entre n et m fois\d{8}
+ / * / ?1 ou plus / 0 ou plus / 0 ou 1\d+
^ / $début / fin du texte
( )un groupe à extraire(\d{2})/

Les fonctions du module re

FonctionRôle
re.fullmatch(motif, texte)tout le texte respecte-t-il le motif ?
re.match(motif, texte)le début du texte respecte-t-il le motif ?
re.search(motif, texte)première correspondance n’importe où
re.findall(motif, texte)liste de toutes les correspondances
re.sub(motif, remplacement, texte)remplacer les correspondances
re.compile(motif)préparer un motif réutilisé souvent

Une correspondance trouvée est un objet Match : m.group() donne le texte trouvé, m.groups() les groupes entre parenthèses.

Dans une classe

Ranger les motifs dans un attribut de classe, comme Validateur.MOTIFS, évite de les recopier partout : on les corrige à un seul endroit.

Exemple simple

Le pochoir

Un pochoir ne laisse passer la peinture que là où il est découpé. Une expression régulière est un pochoir pour le texte : seuls les textes qui ont exactement la bonne forme passent.

Exemple simple

Un numéro de téléphone marocain

Un mobile marocain commence par 06 ou 07 et compte 10 chiffres. En regex : un 0, puis 6 ou 7, puis 8 chiffres.

import re
motif = r"^0[67]\d{8}$"
print(bool(re.match(motif, "0612345678")))   # True
print(bool(re.match(motif, "0512345678")))   # False

3Manipuler

Exécutez, puis modifiez les données du formulaire (un e-mail sans point, un téléphone en 05...) et observez les résultats. Essayez aussi d'adapter le motif du téléphone pour accepter +212.
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console

4Pratiquer

Exercice 1 · La CIN marocaine

Une CIN marocaine commence par une ou deux lettres majuscules suivies de 1 à 6 chiffres (ex. AB123456, K45678). Écrivez le motif et testez-le.

Voir le corrigé
import re
motif = r"^[A-Z]{1,2}\d{1,6}$"
for cin in ["AB123456", "K45678", "ab1234", "ABC12"]:
    print(cin, bool(re.fullmatch(motif, cin)))

Exercice 2 · Extraire les prix

Dans le texte « Thé 18 DH, sucre 12.50 DH, menthe 5 DH », extrayez tous les prix sous forme de nombres et faites la somme.

Voir le corrigé
import re
texte = "Thé 18 DH, sucre 12.50 DH, menthe 5 DH"
prix = [float(p) for p in re.findall(r"(\d+(?:\.\d+)?) DH", texte)]
print(prix, sum(prix))   # [18.0, 12.5, 5.0] 35.5

Exercice 3 · Nettoyer les espaces

Remplacez toutes les suites d'espaces d'un texte par un seul espace, et supprimez les espaces au début et à la fin.

Voir le corrigé
import re
texte = "   Bonjour     tout   le monde  "
propre = re.sub(r"\s+", " ", texte).strip()
print(f"[{propre}]")

5Vérifier

1. Que signifie \d{5} dans un motif ?
2. Quelle fonction renvoie toutes les correspondances d'un motif dans un texte ?
3. À quoi servent ^ et $ dans ^0[67]\d{8}$ ?