Un seul motif pour vérifier une plaque
Une expression régulière, souvent appelée regex, est un motif qui décrit un ensemble de mots. Elle permet de chercher, de vérifier ou d’extraire du texte sans écrire de boucle.
Sur le site d’un garage, une plaque comme AB-123-CD a deux lettres, trois chiffres, puis deux lettres. Un seul motif vérifie cette forme. Vous allez apprendre à l’écrire et à le tester avec grep.
À la fin de cette leçon
Remarque
Je peux écrire une expression régulière et la tester avec grep.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Expression régulière | un motif qui décrit un ensemble de mots | |
| Classe de caractères | la liste des caractères permis à un endroit | [0-9] |
| Quantificateur | ce qui dit combien de fois répéter | {3} |
| Alternative | un choix entre deux motifs | chat|chien |
| Ancre | un symbole qui fixe le début ou la fin de la ligne | ^ |
| Groupe | des parenthèses qui forment un seul bloc | (ab)+ |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un motif est fait de quelques briques
Un motif se lit de gauche à droite, brique par brique. Une lettre seule veut dire cette lettre. Un point veut dire n’importe quel caractère. Des crochets donnent une classe de caractères.
Un quantificateur placé après une brique dit combien de fois la répéter. Le tableau ci-dessous liste les briques que vous utiliserez le plus.
Les briques d’une expression régulière
| Brique | Sens | Exemple | Mots acceptés |
|---|---|---|---|
| Une lettre | Cette lettre | chat | chat |
| . | N’importe quel caractère | c.t | cat, cot, c7t |
| [0-9] | Un caractère de la liste | [0-9] | 7 |
| * | Zéro fois ou plus | ab* | a, ab, abbb |
| + | Une fois ou plus | ab+ | ab, abbb |
| ? | Zéro ou une fois | chats? | chat, chats |
| {n} | Exactement n fois | [0-9]{5} | 75001 |
| | | L’un ou l’autre | chat|chien | chat, chien |
| ( ) | Un groupe | (ab)+ | ab, abab |
| ^ et $ | Début et fin de ligne | ^a | a au début |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
grep teste un motif sur chaque ligne
La commande grep -E lit des lignes et garde celles où le motif apparaît. L’option -E permet les briques du tableau.
Avec -x, toute la ligne doit convenir, pas seulement un morceau. -c compte les lignes gardées. -o n’affiche que le morceau qui correspond. Les Runs ci-dessous fournissent les lignes avec printf.
Garder les plaques bien écrites
printf '%s\n' AB-123-CD ab-123-cd AB-12-CD AB-123-CDE | grep -E -x '[A-Z]{2}-[0-9]{3}-[A-Z]{2}'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Garder les codes postaux
printf '%s\n' 75001 7500 750011 13008 | grep -E -x '[0-9]{5}'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter chat, chats et chien
printf '%s\n' chat chats chien chapeau | grep -E -c '^ch(at|ien)s?$'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Extraire les nombres d’une phrase
echo "Le 12 mai, 3 colis et 45 lettres" | grep -E -o '[0-9]+'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Chercher cinq chiffres de suite
# Chercher les codes postaux : cinq chiffres de suite, ni plus ni moins.
texte = "Colis pour 75001 Paris, retour 13008 Marseille, ref 4521"
i = 0
while i < len(texte):
j = i
# On avance tant que le caractère est un chiffre.
while j < len(texte) and texte[j] in "0123456789":
j = j + 1
if j == i:
i = i + 1
else:
if j - i == 5:
print("code postal :", texte[i:j])
i = j
print("fin de la recherche")
# Changez 5 en 4, puis relancez.
Un motif ne sait pas compter sans limite
Une expression régulière décrit exactement les mots qu’un automate fini peut accepter. Elle a donc la même mémoire finie.
Le motif a+b+ veut des a, puis des b. Il ne peut pas exiger autant de b que de a, car il faudrait retenir un nombre aussi grand qu’on veut. Le Run ci-dessous le montre : des mots avec des nombres différents de a et de b passent aussi.
Un motif qui ne compare pas
printf '%s\n' ab aabb aaabb abb ba | grep -E -x 'a+b+'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens pensent qu’une regex vérifie des parenthèses bien emboîtées, quelle que soit la profondeur. C’est faux : il faudrait compter les parenthèses ouvertes sans limite. Un motif convient pour une forme fixe, comme une plaque. Pour l’emboîtement, il faut une grammaire, vue dans la leçon suivante.
Pour aller plus loin
Écrivez un motif pour un numéro de téléphone fixe écrit en dix chiffres, qui commence par 01, 02, 03, 04 ou 05. Testez-le avec trois numéros justes et trois faux.
Écrivez ensuite la même forme en briques pour votre fonction correspond.