Les expressions régulières représentent des motifs qu'on recherche dans une chaîne de caractères.
Chercher un motif simple :
Rechercher au début.
Pour chercher un motif en début de chaine, on utilise l'accent circonflexe : ^.
Rechercher à la fin.
Pour chercher un motif en fin de chaine, on utilise le dollar : $.
Rechercher un caractère spécial.
Les caractères spéciaux des expressions régulières sont ^ $ / . \ ? + * ( ) [ ] { } |
Pour chercher un de ces caractères, il faut le précéder d'un \
Rechercher un motif OU un autre.
Le OU, c'est |
Ignorer la casse.
Si on veur ignorer la casse dans une recherche, c'est à dire ne pas se préoccuper des majuscules et des minuscules, il faut utiliser re.IGNORECASE
Autoriser plusieurs choix pour un même caractère.
On dispose des crochets [ ] qui permettent de donner la liste des caractères autorisés.
Autoriser plusieurs choix pour un même caractère, des listes déjà toutes prêtes.
Dans les crochets [ ], on peut faire référence à des listes pré-établies :
[A-Z] signifie "toutes les majuscules autorisées"
[a-z] signifie "toutes les minuscules autorisées"
[0-9] signifie "tous les chiffres autorisés"
mais aussi : [B-F] signifie "toutes les majuscules de B à F autorisées"
ou bien entendu : [A-Za-z], "toutes les lettres utilisées" (liste de listes)
... etc...
Des raccourcis pour certaines listes très utilisées.
Dans les crochets [ ], on peut faire référence à des listes pré-établies :
\d n'importe quel chiffre <-> [0-9]
\D tout sauf un chiffre
\s un espace, une tabulation ou un retour à la ligne
\S tout sauf un espace, une tabulation ou un retour à la ligne
\w un mot : toute suite de caractères délimitée par des espaces, tabulation ou retour à la ligne
Eviter un caractère, l'opérateur sauf : [^].
Quand les crochets [ ] débutent par ^, la liste des caractères suivants représente les caractères non autorisés :
Les quantificateurs : Comme leur nom l'indique, les quantificateurs s'intéressent au nombre de fois qu'on va trouver tel ou tel caractère (ou groupe de caractères), il y en a quatre.
Le ? signifiera "au plus une fois".
Le + signifiera "au moins une fois".
Le * signifiera "0, une ou plusieurs fois".
Grâce aux accolades, on va fixer un nombre minimum ou maximum d'apparitions.
Le quantificateur ?, il signifie "au plus une fois".
Les quantificateurs quantifient ce qui les précède et non ce qui les suit !!! Dans l'exemple précédent, le ? donne une information sur [A-Z]. Donc on commence à découvrir ici des RegExp un peu complexes. D'un point de vue linguistique, on n'a pas l'habitude qu'une information d'un phrase vienne modifier ce qui la précède. Ceci nous force à faire des retour arrière auxquels notre esprit de lecteur n'est pas habitué.
Le quantificateur +, il signifie "au moins une fois".
Le quantificateur *, il signifie "zéro, une ou plusieurs fois".
Les quantificateurs accolades : Le quantificateur { } indique un nombre de répétitions cherchées dans la chaîne
{k} : on cherche k fois le caractère précédent :
'ba{2}d' → on va trouver baad, mais pas bd, bad, baaad etc...
{k, } : on cherche au moins k fois le caractère précédent :
'ba{2,}d' → on va trouver baad, baaad, baaaad mais pas bd ni bad
{ ,k} : on cherche au plus k fois le caractère :
'ba{,2}d' → on va trouver bd, bad, baad, mais pas baaad...
{k,l} : on cherche entre k et l fois le caractère :
'ba{2,4}d' → on va trouver baad, baaad, baaaad mais pas bd, bad, baaaaad...
Le point (.) est un joker, il représente n'importe quel caractère.
Les prenthèses servent à grouper les caractères.
Quelques exemples plus poussés
Chercher un numéro de téléphone.
Des pièges à éviter
Oublier de protéger les caractères spéciaux
Le rôle de p dans le quantificateur {n,p}
Chercher une chaine qui ne contient pas de r
Mettre des espaces dans les expressions régulières pour les rendre plus lisibles
Bon à savoir
La méthode group.
Quand on cherche des groupes dans une regexp, c'est à dire qu'on a utilisé des parenthèses, les groupes trouvés sont numérotés et réutilisables par la suite via la méthode group.
Vite un exemple !
La méthode sub.
La méthode sub permet de remplacer une regexp par une autre dans une chaine de caractères.
Un exemple simple :
Un exemple plus élaboré :
Plus fort avec sub : remplacer des tirets pas des slash dans une date.
Il faut savoir que les groupes déterminés par des parenthèses sont numérotés, même sans utiliser la méthode group. Les groupes sont référencés \1 \2 \3 ...par ordre d'apparition. Vous allez comprendre avec l'exemple suivant.
Encore plus fort.... :
On peut ne pas utiliser les numéros des groupes mais donner nos propres noms à nos groupes, ça rend le code plus lisible ! Pour nommer un groupe, il faut faire suivre la parenthèse ouvrant le groupe :
d'un point d'interrogation,
d'un P majuscule
et du nom du groupe entre chevrons <>.
Dans l'expression de remplacement, il faut précéder le nom du groupe entre chevrons par \g (pour groupe)
La méthode findall.
Comme son nom l'indique, elle retourne la liste de toutes les occurrences de la regexp rencontrée dans une chaine de caractères.
Compiler une regexp.
On peut compiler une regexp avec la méthode compile, c'est utile quand elle doit resservir.
Cela permet de lui donner un nom pour alléger le code.
Exercice à réponse courte : Chercher un motif simple
Donner la RegExp pour chercher le motif "oui". Donner la réponse entre quotes.
Bien !
Exercice à réponse courte : Chercher un motif au début
Donner la RegExp pour chercher les chaines qui débutent par une majuscule. Donner la réponse entre quotes.
Bien !
Exercice à réponse courte : Chercher un motif à la fin
Donner la RegExp pour chercher les chaines qui terminent par un point. Donner la réponse entre quotes.
Bien !
Exercice à réponse courte : Chercher un caractère spécial
Donner la RegExp pour chercher les chaines qui terminent par un point d'interrogation. Donner la réponse entre quotes.
Bien !
Exercice à réponse courte : Chercher un caractère spécial
Donner la RegExp pour chercher les chaines qui contiennent le motif "\\(Linux\\)". Donner la réponse en quotes.
Bien !
Exercice à choix multiple : Chercher un caractère spécial
Donner la RegExp pour chercher les chaines qui terminent par le motif "[...]".
Bien !
Exercice à choix multiple : Chercher un motif ou un autre
Donner la RegExp pour chercher les chaines qui débutent par B ou D.
Bien !
Exercice à choix multiple : Ignorer la casse
Quelle est la bonne syntaxe pour savoir si la chaine L termine par jpg ou JPG ou Jpg ou plus généralement, par les 8 combinaisons possibles de jpg en acceptant majuscules ou minuscules ?
Bien !
Exercice à choix multiple : Autoriser plusieurs caractères
Quelle est la bonne syntaxe pour savoir si la chaine L contient un "ou" ou un "oi" ou un "on" ou un "om" ?
Bien !
Exercice à choix multiple : Les listes standards
Quelle chaine matche l'expression régulière '^[A-Z]|[0-9]$' ?
Bien !
Exercice à choix multiple : Des raccourcis classiques
Quelle chaine matche l'expression régulière '\s\d\D\d\s' ?
Bien !
Exercice à choix multiple : L'opérateur sauf
Quelle chaine ne matche pas l'expression régulière '^[^a-z]' ?
Bien !
Exercice à choix multiple : Le quantificateur ?
Quelle chaine matche l'expression régulière 'html?$' ?
Bien !
Exercice à choix multiple : Le quantificateur +
Quelle chaine matche l'expression régulière '^[A-Z][0-9]+' ?
Bien !
Exercice à choix multiple : Le quantificateur *
Quelle chaine ne matche pas l'expression régulière '\d\D*\d' ?
Bien !
Exercice à choix multiple : Les accolades
Quelle chaine ne matche pas l'expression régulière '[A-Z]\d{3,5}\s' ?
Bien !
Exercice à choix multiple : La caractère .
Quelle chaine ne matche pas l'expression régulière '^[A-Z].*\.$' ?
Bien !
Exercice à choix multiple : Grouper des caractères
Quelle chaine matche l'expression régulière '\D(\d-\d){3}\D' ?
Bien !
Questions souvent posées
J'ai vu sur des sites des chaines de caractères débutant pas la lettre r avant les guillemets, c'est quoi ?
Il s'agit des raw-strings, des chaines brutes dans lesquelles tous les caractères sont traités pour ce qu'ils sont. Les caractères d'échappement sont ignorés.