Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Expressions régulières avec grep

Après cette leçon: Je peux écrire une expression régulière et la tester avec grep.

Leçon de 55 min5 commandesLab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

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

MotCe que ça veut direExemple
Expression régulièreun motif qui décrit un ensemble de mots
Classe de caractèresla liste des caractères permis à un endroit[0-9]
Quantificateurce qui dit combien de fois répéter{3}
Alternativeun choix entre deux motifschat|chien
Ancreun symbole qui fixe le début ou la fin de la ligne^
Groupedes 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

BriqueSensExempleMots acceptés
Une lettreCette lettrechatchat
.N’importe quel caractèrec.tcat, cot, c7t
[0-9]Un caractère de la liste[0-9]7
*Zéro fois ou plusab*a, ab, abbb
+Une fois ou plusab+ab, abbb
?Zéro ou une foischats?chat, chats
{n}Exactement n fois[0-9]{5}75001
|L’un ou l’autrechat|chienchat, chien
( )Un groupe(ab)+ab, abab
^ et $Début et fin de ligne^aa 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

Commande
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

Commande
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

Commande
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

Commande
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

Code: python
# 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

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

À propos de ce labo et de sa source: Lab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.