Les expressions régulières en Python

Les expressions régulières, également appelées RE, ou regex, ou modèles d’expression régulière, fournissent un moyen puissant pour rechercher et manipuler des chaînes de caractères.

Les expressions régulières sont essentiellement un minuscule, langage de programmation hautement spécialisé, intégré à Python et mis à disposition via le module re.

En fait, les expressions régulières utilisent une séquence de caractères et de symboles pour définir un modèle de texte. Un tel modèle est utilisé pour localiser un morceau de texte dans une chaîne de caractères en faisant correspondre le modèle aux caractères.

Les expressions régulières

Les expressions régulières sont utiles pour rechercher des numéros de téléphone, des adresses e-mail, des dates et toute autre donnée ayant un format cohérent.

La bibliothèque re en Python fournit plusieurs fonctions très utiles. En fait, les expressions régulières doivent être maîtrisées si vous voulez améliorer vos compétences.

>>> import re
>>> print(re.match ("p", "python"))
<re.Match object; span=(0, 1), match='p'>

La dernière ligne signifie qu’un nouvel objet sre.SRE a été créé.

Les modèles de base des expressions régulières

Pour rechercher un modèle dans une chaîne de caractère, on utilise les fonctions du module re.

>>> import re
>>> modele = r"bonjour"
>>> texte = "bonjour les amis"
>>> if re.match(modele, texte):
	print("Oui")
else :
	print("Non")

Résultat :

Oui

Pour faire simple, nous avons vérifié si un modèle correspond à un texte. Notez que le modèle à rechercher est précédé par la lettre r ou raw string qui veut dire une chaîne de caractère brute . Par exemple un antislash \ sera considéré comme une barre et non pas comme un caractère d’échappement.

match() : recherche le modèle et retourne la première occurrence. Cette méthode vérifie une correspondance uniquement au début de la chaîne.

search() : recherche la première occurrence du modèle. Contrairement à match(), elle vérifie toutes les lignes de la chaîne.

findall(): recherche toutes les occurrences qui correspondent à un modèle. En revanche, search() ne retournera que la première occurrence.

group() : renvoie un ou plusieurs sous-groupes qui correspondent à notre modèle.

Les caractères spéciaux

La puissance des expressions régulières vient lorsque nous ajoutons des caractères spéciaux, ce qui permet de contrôler plus précisément quelles lignes correspond à la chaîne. L’ajout de ces caractères spéciaux à notre expression régulière permet de faire des correspondances et des extractions sophistiquées avec peu de code.

Les caractères spéciaux ne correspondent pas à eux-même, ils ont une signification particulière lorsqu’ils sont utilisés. Par exemple, lorsque la recherche nécessite plus qu’une correspondance, comme rechercher un ou plusieurs f ou d’un espace blanc, le motif utilisera des caractères spéciaux.

Le point . correspond à n’importe quel caractère unique à l’exception du caractère de nouvelle ligne.

>>> re.search(r"b.nj.ur", "bonjour les champions").group()
'bonjour'

^ correspond au début de la chaîne.

>>> re.search(r"^bonjour", "bonjour les champions").group()
'bonjour'

$ correspond à la fin de la chaîne.

>>> re.search(r"champions$", "bonjour les champions").group()
'champions'

[abc]correspond à a, b ou c.
[a-zA-Z0-9]correspond à n’importe quelle lettre de (a à z) ou (A à Z) ou (0 à 9).

>>> re.search(r'[0-9]', '3 pommes').group()
'3'

* correspond à zéro ou plusieurs répétitions d’une expression régulière Python.
+ une ou plusieurs répétitions de l’élément.
? correspond à zéro ou à une expression régulière.
{} les accolades sont utilisé :
soit comme {m}, pour faire correspondre exactement le nombre d’occurrence à ‘m’.
Ou {m, n}n> m, ce qui signifie que le nombre d’occurrence est entre ‘m’ et 'n'.
| pour séparer les alternatives.
() pour regrouper différents symboles traités comme un seul bloc.

Les symboles *, + ,? et {} sont appelés répéteurs, car ils spécifient le nombre de fois où l’élément précédent est répété.

\d correspond à n’importe quel chiffre décimal. La même chose que [0-9].
\D correspond à n’importe quel caractère non décimal. La même chose que [^ 0-9].
\s n’importe quel caractère d’espace blanc.
\S correspond à tout caractère sauf un espace blanc.
\w correspond à n’importe quel caractère alphanumérique.
\W tout caractère non alphanumérique.
. = correspond à n’importe quel caractère, sauf pour une nouvelle ligne.

La fonction match()

>>> texte = "Je bois 2 litres d'eau par jour."
>>> re.match(r"[a-zA-Z]+", texte).group()
'Je'

Cette expression régulière correspond au premier mot trouvé dans la chaîne. L’opérateur + spécifie que la chaîne doit contenir au moins un caractère.

Après le mot Je, il y a un espace, qui n’est pas traité comme une lettre. Cependant, si la chaîne commençait par un nombre, un None sera renvoyé, même si la chaîne comporte des lettres après le nombre.

>>> texte = "1,2,3 Je bois 2 litres d'eau par jour."
>>> print(re.match(r"[a-zA-Z]+", texte))
None

Ce problème peut être résolu en utilisant la fonction search().

La fonction search()

La fonction search()recherche le modèle dans toute la chaîne, contrairement à match() qui vérifie uniquement le premier élément d’une chaîne.
Reprenons l’exemple précédent avec search() :

>>> texte = "1,2,3 Je bois 2 littres d'eau par jour."
>>> re.search(r"[a-zA-Z]+", texte).group()
'Je'

En effet, la fonction search() renvoie une correspondance, même si la chaîne ne commence pas par des lettres.

Correspondance des chaînes du début et de la fin

Nous pouvons utiliser regex pour trouver si une chaîne de caractères commence par un modèle particulier en utilisant l’opérateur ^. De même, l’opérateur $ est utilisé pour rechercher si une chaîne se termine par un modèle donné.

>>> if re.search(r"^1", texte):
	print("La chaîne commence par le nombre 1")
else:
	print("La chaîne ne commence pas par le nombre 1")

	
La chaîne commence par le nombre 1

La fonction sub()

Nous avons utilisé les expressions régulière Python pour trouver un modèle dans une chaîne. Essayons à présent de trouver comment substituer un texte dans une chaîne avec la fonction sub(). En fait, cette fonction recherche un modèle particulier dans une chaîne et le remplace par un nouveau modèle.

>>> texte = "Je bois 2 littres d'eau par jour."
>>> modele = re.sub(r"littres", "verres", texte)
>>> modele
"Je bois 2 verres d'eau par jour."

Le premier paramètre de la fonction sub() est le modèle à remplacer. Le deuxième paramètre contient le nouveau texte qui va remplacer l’ancien. Le troisième paramètre est la chaîne sur laquelle l’opération est effectuée.

Écrire des expressions régulières Python avec des identifiants

Suposons que nous voulions supprimer des chiffres dans une chaîne.

>>> texte = "Je bois 2 litres d'eau par jour."
>>> modele = re.sub(r"\d", "deux ", texte)
>>> modele
"Je bois deux litres d'eau par jour."

Le code ci-dessus recherche les chiffres dans une chaîne en utilisant l’identificateur \d et le remplace par une chaîne de caractères.

Fractionner une chaîne avec les expressions régulières

La fonction split() fractionne des chaînes et renvoie une liste de sous-chaînes. par exemple, le code suivant découpe une chaîne de mots, lorsqu’une virgule est trouvée.

>>> texte = "Je mange une pomme, une banane, une poire et une mangue."
>>> modele = re.split(r",", texte)
>>> modele
['Je mange une pomme', ' une banane', ' une poire et une mangue.']

La fonction findall()

La fonction findall() renvoie une liste qui contient tous les éléments qui correspondent au modèle.

Écrivons un programme qui trouve le type de domaine à partir d’une liste de messagerie.

>>> modele = re.findall(r'@\w+.\w+','joe.toto@gmail.com, nadine@yahoo.in, karl@remedes.com')
>>> modele
['@gmail.com', '@yahoo.in', '@remedes.com']

Même s’il apparaissent un peu compliquées, les expressions régulières sont un outil simple mais très puissant. Toutefois, une fois que vous aurez compris le concept, vous ne pourrez plus vous en passer.

Les expressions régulières en Python

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Retour en haut