Python - Expressions régulières (Regex)
Dans cette quête tu découvriras les expressions régulières et leur rôle.
Le terme correct à utiliser en français devrait être "expressions rationnelles". Toutefois la plupart des ressources que tu consulteras écrivent plutôt "expressions régulières". C'est tout simplement une mauvaise traduction de l'anglais regular expression (abrégé en regex). Par soucis de simplification, nous allons garder ce terme (même si partiellement incorrect) pour le reste de la quête.
Objectifs
🤓 A la fin de cette quête, tu seras capable de :
- ✅ Comprendre les expressions régulières
- ✅ Utiliser les expressions régulières
👀 Contenu de la quête:
- Introduction
- Le module re
- Rechercher des termes à l'aide des regex
👉 Introduction
En tant que data analyst tu seras parfois amené à faire de l'analyse syntaxique (parsing en anglais).
Imagine que tu aies à faire à des données textuelles contenant des noms de différents vins écrits comme dans cet exemple : "Domaine Marcel Deiss 2016 Pinot Gris (Alsace)". Dans le cadre d'un projet, on attend de toi que tu établisses une liste contenant tous les millésimes que tu devras donc récupérer dans chaque nom de vin. Tu penses à recopier tous les millésimes à la main ?
- Si on a une centaine de vins ta solution peut marcher (quoique fastidieuse).
- Si on a des milliers ou des millions de millésimes à récupérer tu serais tout de même content(e) de pouvoir éviter de tout recopier à la main non ?
Une expression régulière est un ensemble de caractères décrivant un motif permettant d'identifier et/ou d'extraire les occurrences d’un terme dans un texte. Les expressions régulières (motifs) sont utilisées dans la plupart des langages de programmation, mais également par de nombreux outils UNIX (comme grep, sed...) et les fonctions de recherche de certains outils de bureautique. Leur utilisation est universelle, c'est pourquoi il est indispensable que tu saches t'en servir.
Revenons à nos millésimes. Tu peux en effet utiliser les expressions régulières, en te servant d'un motif qui va rechercher la présence d'un terme correspondant à une suite de 4 chiffres vu que le millésime est en fait une année. Tu veux voir ce que ça donne concrètement ?
vin = "Domaine Marcel Deiss 2016 Pinot Gris (Alsace)"
import re
millésime = re.findall('\d+', vin)
print(millésime)
['2016'] # Résultat obtenu
Tu as certainement quelques questions liées à l'exemple ci-dessus n'est ce pas ? Pas de panique, voici quelques précisions :
- vin : la variable qui contient le texte dans lequel on recherche le millésime
- import re : permet d'importer le module re de python pour traiter les regex
- findall() : est une fonction du module re qui permet de chercher toutes les occurences d'un motif
- \d+ : est le motif recherché que tu dois entourer de guillemets. Ce motif fait référence à un terme contenant un ou plusieurs chiffres.
Ce que tu viens de voir est assez simple, mais il est possible que les termes recherchés correspondent à des motifs bien plus complexes. Dans la suite de cette quête nous allons te présenter quelques fonctions du module re de python, ainsi que quelques des éléments de syntaxe qui t'aideront à comprendre et construire des regex.
👉 Le module re
Il existe un module re en python permettant de gérer les regex. Lorsqu'on souhaite travailler avec les regex on commence donc par importer ce module (import re) qui contient un certain nombre de fonctions. Ci-dessous tu as quelques exemples d'utilisation de certaines fonctions du module re. Dans chacun des cas, n'hésite pas à copier et coller le code python dans un notebook puis exécuter pour voir le résultat. (NB : ne pas copier les lignes de résultats).
- re.search(motif, texte) : Renvoie un objet s'il y a une occurence du motif dans le texte
import re
fournitures = "cahier stylo crayon"
re.search("stylo", fournitures)
<re.Match object; span=(7, 12), match='stylo'> # Résultat : Objet python
# On peut ensuite utiliser une expression conditionnelle pour vérifier que tout est Ok
import re
fournitures = "cahier stylo crayon"
re.search("stylo", fournitures)
if re.search("stylo", fournitures):
print("OK")
OK # Résultat
- re.findall(motif, texte) : Renvoie une liste contenant toutes les occurences d'un motif dans un texte
import re
fournitures = "cahier stylo crayon stylo"
re.findall("stylo", fournitures)
['stylo', 'stylo'] # Résultat renvoyé une liste
- re.split(motif, texte) : Renvoie une liste de mots à partir du texte. Le motif sert de sepérateur pour découper le texte en mots.
import re
fournitures = "cahier stylo crayon"
re.split("stylo", fournitures)
['cahier ', ' crayon'] # Résultat renvoyé
- re.sub(motif, mot_de_remplacement, texte) : Replaces one or many matches with a string
import re
fournitures = "cahier stylo crayon"
re.sub("stylo", "crayon", fournitures)
'cahier crayon crayon' # Résultat renvoyé
👉 Rechercher des termes à l'aide des regex
Dans les exemples ci-dessus, pour te permettre de comprendre facilement l'utilisation des fonctions, nous avons utilisé des regex qui étaient simplement des mots. A présent tu vas voir comment construire des regex à partir de différents caractères ([], ?, *, ^, ., \ ...).
Pour la suite de la quête, et afin de mieux assimiler tout ce que tu vas apprendre, tu vas pouvoir tester les différentes notions en utilisant un outil en ligne. Clique sur ce lien pour ouvrir un(e) nouvel onglet/fenêtre avant de continuer. Voici une petite description de ce que tu verras sur cette page web :

Il existe également une très bonne ressource [ici] (https://regexcrossword.com/) pour apprendre les regex tout en s'amusant 😃.
Tu noteras que l'outil en ligne te permet simplement de repérer la présence d'un motif dans le texte (la fonction findall() du module re). L'objectif étant pour toi de te familiariser avec la syntaxe des regex et de voir comment retouver des informations à l'aide de différents motifs.
Tu peux utiliser le texte ci-dessous pour tester les regex que nous allons voir par la suite. Copie-le puis colle-le dans le champ correspondant.
"The Saturn V was launched 13 times from Kennedy Space Center with no loss of crew or payload. As of 2021, the Saturn V remains the tallest, heaviest, and most powerful (highest total impulse) rocket ever brought to operational status, and it holds records for the heaviest payload launched and largest payload capacity to low Earth orbit (LEO) of 310,000 lb (140,000 kg), which included the third stage and unburned propellant needed to send the Apollo command and service module and Lunar Module to the Moon."
Recherche simple
Pour faire une recherche simple, tu vas entrer un mot dans le champ prévu pour la regex afin de vérifier si ce dernier se trouve dans le texte. Par exemple, écris Saturn tu vois apparaitre en dessous le résultat : il y a 2 occurences de ce mot dans le texte qui t'a été donné en exemple.
Recherche en utilisant des métacaractères
Les métacaractères ou caractères spéciaux ont une signification particulière lorsqu'on définit des motifs de recherche.
. : Pour rechercher n'importe quel caractère
- Dans l'outil en ligne, recherche le motif
.
? : Pour rechercher la présense d'un caractère facultatif
- Dans l'outil en ligne, recherche le motif
re?Ceci va sélectionner toutes les lettres 'r' suivies ou non de la lettre 'e' (vu que la présence de 'e' ici est facultative)
^: Pour rechercher si un motif se trouve au début du texte
- Recherche dans l'outil en ligne le motif
^The
$ : Pour rechercher si un motif se trouve à la fin du texte
- Recherche dans l'outil en ligne le motif
Moon.$
| : Pour rechercher si parmi deux motifs au moins un est présent dans le texte.
- Recherche dans l'outil en ligne le motif
crew|team.
\ : Pour rechercher une suite de caractères ou pour échapper des caractères spéciaux
- Dans l'outil en ligne, recherche dans le texte la présence des motifs suivants :
\det\&. Dans le premier cas tu vas indentifier tous les chiffres présents dans le texte, et dans le second tous les & présents dans le texte.
* : Pour rechercher si un motif est présent zéro ou plusieurs fois dans le texte
- Recherche dans l'outil en ligne le motif
en*. Il te permet de retrouver tous les cas où on a une lettre 'e' suivie ou pas de une ou plusieurs lettres 'n'.
+ : Pour rechercher si un motif est présent une ou plusieurs fois dans le texte
- Recherche dans l'outil en ligne le motif
en+. Il te permet de retrouver tous les cas où on a une lettre 'e' suivie de 1 ou plusieurs lettres 'n'.
{} : Pour définir le nombre exact d'occurences du motif recherché dans le texte.
- Recherche dans l'outil en ligne le motif
en{2}. Il te permet de retrouver tous les cas où on a une lettre 'e' suivie de deux lettres 'n'.
() : Pour rechercher un motif contenant des sous groupes de motifs.
- Recherche dans l'outil en ligne le motif
([a-z]+) (\d+). Il te permet de retrouver un groupe de une ou plusieurs lettres minuscules suivie d'un groupe de un ou plusieurs chiffres.
Recherche à l'aide de séquences
\Amotif : Pour rechercher si un motif se trouve au début du texte
- Dans l'outil en ligne, effectue une recherche en utilisant
\ATheet regarde le résultat
\Bmotif : Pour rechercher si un motif se trouve dans le texte mais pas au début d'un mot, et motif\B permet de vérifier que le motif se trouve dans le texte mais pas à la fin d'un mot
- Dans l'outil en ligne effectue une recherche en utilisant
\Best, puisest\B
\D : Pour rechercher tous les éléments du texte qui ne contiennent aucun chiffre
- Dans l'outil en ligne effectue une recherche en utilisant
\D
\S : Pour rechercher tous les éléments du texte autres que des espacements
- Dans l'outil en ligne effectue une recherche en utilisant
\S
\W : Pour rechercher tous les éléments du texte à l'exception des caractères alphanumériques (lettres et chiffres)
- Dans l'outil en ligne effectue une recherche en utilisant
\W
\Z : Pour rechercher si un motif se toruve à la fin du texte
- Dans l'outil en ligne effectue une recherche en utilisant
Moon.\Z
\bmotif : Pour rechercher si un motif se trouve dans le texte et au début d'un mot, tandis que motif\b permet de vérifier que le motif se trouve dans le texte et à la fin d'un mot.
- Dans l'outil en ligne effectue une recherche en utilisant
\blo, puislo\b
\d : Pour rechercher tous les éléments du texte qui sont des chiffres
- Dans l'outil en ligne effectue une recherche en utilisant
\d
\s : Pour rechercher tous les espacements dans le texte
- Dans l'outil en ligne effectue une recherche en utilisant
\s
\w : Pour rechercher tous les caractères alphanumériques (lettres et chiffres) dans le texte
- Dans l'outil en ligne effectue une recherche en utilisant
\w
Recherche par ensemble de caractères
On se sert des crochets [ ] pour définir un ensemble de caractères à rechercher. Plusieurs cas de figures peuvent alors se présenter.
-
Recherche d'une liste de motifs. Par exemple pour rechercher toutes les lettres 'o' 'm' et 'a' utilise le motif
[oma]dans l'outil en ligne -
Recherche d'une plage de motifs. Par exemple pour rechercher toutes les lettres allant de 'a' 'm' utilise le motif
[a-m]dans l'outil en ligne -
Ca marche également avec les chiffres. Dans l'util en ligne effectue une recherche avec les motifs
[123]et[0-3]et regarde les résultats. -
Et pour exclure un ensemble de caractère de la recherche, on rajoute
^dans le motif. Dans l'outil en ligne utilise le motif[^a-d]pour sélectionner tous les caractères sauf les lettres de 'a' 'b', 'c' et 'd'. -
Pour rechercher un ou plusieurs motifs dans un texte, on peut également se servir de
?. Dans l'outil en ligne, utilise le motifre[mwc]?pour retouver 'rem', 'rew' ou 'rec' dans le texte.
L'idée de cette quête étant d'introduire le sujet, et tout ce que tu viens de voir te permet donc déjà de comprendre et manipuler les regex. Il existe de nombreuses ressources sur les regex. Tu peux approfondir tes connaissaces en consultant celles qui te sont proposées ci-dessous.
Ressources
Quiz
true|||true|||true
# Pour importer le module python qui me permet de travailler avec les regex
[x] import re
[] import RegX
[] import REx
[] import RegEx
# Que signifie le métacaractère `*` dans une regex
[] Rechercher une ou plusieurs occurences
[] Rechercher plusieurs occurences
[] Rechercher de multiples occurences
[x] Rechercher zero ou plusieurs occurences
# Que signifie le métacaractère `+` dans une regex
[x] Rechercher une ou plusieurs occurences
[] Rechercher toutes les occurences
[] Rechercher zero ou plusieurs occurences
# Laquelle de ces fonctions appartiennent au module re de python ?
[] split()
[] findall()
[] sub()
[x] Toutes ces fonctions
💪 Challenge
Utilisation des regex
Dans ce challenge tu vas t'entraîner à utiliser les regex.
Crée une copie du notebook ci-après et répond aux questions qui s'y trouvent : Regex python
🧐 Critères de validation
- Lien vers le Notebook de ta solution
- Pour chacune des questions tu as trouvé une regex qui permet d'obtenir le résultat indiqué.
Ressources partagées sur cette quête
- CheatSheet au format PDFhttps://images.datacamp.com/image/upload/v1665049611/Marketing/Blog/Regular_Expressions_Cheat_Sheet.pdf
- Pour apprendre les regex on peut difficilement faire plus simple et plus efficace!https://regexlearn.com/
- Colab in English :) (google translate, so watch out!)https://colab.research.google.com/drive/1rjHEfiAimri6usgjX6NsqGtYUeMtkLKh?usp=sharing
- Un autre lien extrêmement instructif sur l'utilisation basique des regexhttps://towardsdatascience.com/novice-to-advanced-regex-in-nine-minutes-or-less-6af45a1df8c8
- Date search using regexhttps://uibakery.io/regex-library/date-regex-python
- tout savoir sur regexhttps://datascientest.com/regex-tout-savoir