Les Python RegEx, ou ex­pres­sions ré­gu­lières, peuvent être utilisées avec le langage après l’im­por­ta­tion du package intégré « re », qui permet de re­cher­cher des modèles spé­ci­fiques dans les chaînes de ca­rac­tères.

Python RegEx : de quoi s’agit-il exac­te­ment ?

Le terme « RegEx » désigne, en abrégé, les ex­pres­sions ré­gu­lières. Ces chaînes de ca­rac­tères per­met­tent de définir des modèles de recherche spé­ci­fiques. Vous pouvez les utiliser pour appliquer ces modèles de recherche aux chaînes en Python. Les Python RegEx fonc­tion­nent selon une syntaxe et une sé­man­tique qui leur sont propres.

Note

Les ex­pres­sions ré­gu­lières relèvent d’une technique de pro­gram­ma­tion avancée, présentée en détail dans quelques tutoriels Python. Si les tech­niques de pro­gram­ma­tion avancée en Python vous in­té­res­sent, les articles suivants peuvent vous permettre d’aller plus loin :

Domaines d’uti­li­sa­tion des Python RegEx

Les ex­pres­sions ré­gu­lières sont souvent utilisées pour vérifier que les données ren­seig­nées par les uti­li­sa­teurs d’un programme res­pec­tent bien le format prescrit.

L’exemple le plus connu de l’uti­li­sa­tion de RegEx, qui vous est cer­tai­ne­ment familier, se rapporte à la création de mots de passe, ceux-ci devant souvent contenir au moins une lettre majuscule, au moins un chiffre, etc. Les Python RegEx peuvent être utilisées à cet effet ; elles per­met­tent de vérifier que votre saisie respecte les ins­truc­tions qui vous ont été données.

De la même manière, les ex­pres­sions ré­gu­lières sont fré­quem­ment utilisées dans le cadre du rem­plis­sage de for­mu­laires Web, toujours pour vérifier la validité des données ren­seig­nées par l’uti­li­sa­teur. Elles peuvent notamment permettre de dé­ter­mi­ner si le format de l’adresse email saisie par l’uti­li­sa­teur est bien valide.

Conseil

Si vous utilisez Python pour votre projet Web, les ex­pres­sions ré­gu­lières peuvent plus d’une fois vous être utiles. L’outil Deploy Now proposé par IONOS peut lui aussi vous être d’une grande aide ; utilisez-le pour concevoir et déployer vos projets Web en passant di­rec­te­ment par GitHub.

Syntaxe et sé­man­tique des Python RegEx

Les ex­pres­sions ré­gu­lières con­tien­nent des éléments appelés « mé­ta­ca­rac­tères». Chacun de ces ca­rac­tères revêt une sig­ni­fi­ca­tion bien précise dans le cadre des Python RegEx. Le tableau ci-dessous vous donne un aperçu des prin­ci­paux mé­ta­ca­rac­tères, tous étant ac­com­pag­nés de leur sig­ni­fi­ca­tion et d’un exemple :

Caractère Sig­ni­fi­ca­tion Exemple
. Re­pré­sente n’importe quel caractère à l’exception de « \n » (nouvelle ligne) « bo….r » -> trouve toutes les chaînes de quatre ca­rac­tères quel­conques encadrés par « bo » au début et « r » à la fin, par exemple « bonjour »
[] Trouve toutes les lettres spé­ci­fiées entre les deux crochets « [a-e] » -> trouve toutes les lettres mi­nus­cules comprises entre « a » et « e »
^ Vérifie si la chaîne commence bien par le caractère requis ou la chaîne de ca­rac­tères spécifiée « ^bonjour » -> vérifie si la chaîne commence bien par « bonjour »
$ Vérifie si la chaîne se termine bien par le caractère requis ou la chaîne de ca­rac­tères spécifiée « $monde » -> vérifie si la chaîne se termine bien par « monde »
* Re­pré­sente l’absence d’oc­cur­rence d’un caractère ou la présence de plusieurs oc­cur­rences « a* » -> cible la présence de plusieurs « a » ou l’absence de « a »
+ Re­pré­sente une ou plusieurs oc­cur­rences d’un caractère « a+ » -> cible au moins une oc­cur­rence du caractère « a »
? Re­pré­sente l’absence d’oc­cur­rence d’un caractère ou la présence d’une oc­cur­rence « a? » -> cible la présence d’un « a » ou l’absence de « a »
{} Vérifie si un caractère apparaît autant de fois que le nombre spécifié entre accolades « car{2}é » -> cible la chaîne « carré »

Classes de ca­rac­tères

Les classes de ca­rac­tères sont par­ti­cu­liè­re­ment im­por­tantes pour la majorité des Python RegEx ; il est donc utile de s’y in­té­res­ser d’un peu plus près. Les classes de ca­rac­tères sont des modèles de RegEx qui com­men­cent et se terminent par des crochets. Le tableau ci-dessus contient déjà un exemple de classe de ca­rac­tères, celle-ci per­met­tant de trouver toutes les lettres mi­nus­cules comprises entre « a » et « e ». Nous allons main­te­nant vous présenter ra­pi­de­ment les cas d’uti­li­sa­tion courants des classes de ca­rac­tères associées aux Python RegEx :

Classe de ca­rac­tères Sig­ni­fi­ca­tion
[abc] Cherche si l’un des ca­rac­tères spécifiés entre les crochets (ici « a », « b » ou « c ») apparaît dans une chaîne de ca­rac­tères
[^abc] Cible tous les ca­rac­tères n’ayant pas été spécifiés entre les crochets
[a-z] Cible toutes les lettres mi­nus­cules comprises entre « a » et « z »
[a-zA-Z] Cible toutes les lettres comprises entre « a » et « z », qu’elles soient ma­jus­cules ou mi­nus­cules
[0-9] Cible tous les chiffres compris entre 0 et 9
[1-5][0-9] Cible tous les nombres compris entre 10 et 59

Comme vous pouvez le voir, les classes de ca­rac­tères cons­ti­tuent un outil pour diverses ex­pres­sions ré­gu­lières. Attention : si vous souhaitez utiliser des classes de ca­rac­tères, vous devez savoir que les mé­ta­ca­rac­tères que nous vous avons présentés ci-dessus n’ont aucune sig­ni­fi­ca­tion spé­ci­fique lorsqu’ils se trouvent entre crochets. Ainsi, la classe de ca­rac­tères « [] » ciblerait tous les symboles « » dans la chaîne de ca­rac­tères concernée.

Séquences

En plus des mé­ta­ca­rac­tères dont nous avons déjà parlé, les Python RegEx vous per­met­tent d’utiliser des séquences spéciales et pré­dé­fi­nies afin de créer des modèles de recherche précis.

Séquence Sig­ni­fi­ca­tion Exemple
\A Cible la chaîne de ca­rac­tères spécifiée lorsqu’elle se trouve au début d’une chaîne « \ALundi »
  • Cible la chaîne « Lundi est une belle journée »
  • Ne cible pas la chaîne « Nous sommes lundi »
\b Cible la chaîne de ca­rac­tères spécifiée lorsqu’elle se trouve au début ou à la fin d’un mot « \bla »
  • Cible la chaîne « Appelle-la »
  • Cible la chaîne « Larme »
  • Ne cible pas la chaîne « Hilarant » « la\b »
  • Cible la chaîne « Gor­gon­zola »
  • Cible la chaîne « Il grommela quelques mots »
  • Ne cible pas la chaîne « Alarme »
\B Cible la chaîne de ca­rac­tères spécifiée lorsqu’elle ne se trouve ni au début ni à la fin d’un mot (con­trai­re­ment à la séquence « \b ») « \Bla »br>- Ne cible pas la chaîne « Appelle-la »
  • Ne cible pas la chaîne « Larme »
  • Cible la chaîne « Hilarant » « la\B »
  • Ne cible pas la chaîne « Gor­gon­zola »
  • Ne cible pas la chaîne « Il grommela quelques mots »
  • Cible la chaîne « Alarme »
\d Cible tous les chiffres compris entre 0 et 9 (comme la classe de ca­rac­tères « [0-9] ») « 123 »
  • « \d » trouve trois cor­res­pon­dances pour 1, 2 et 3
\D Cible tous les ca­rac­tères ne cor­res­pon­dant pas à des chiffres (comme la classe de ca­rac­tères « [^0-9] ») « 123acb& »
  • « \D » trouve quatre cor­res­pon­dances pour « a », « c », « b » et « & »
\s Cible les chaînes de ca­rac­tères contenant un espace « RegEx Python »
  • « \s » cible cette chaîne, car elle contient un espace
\S Cible les chaînes de ca­rac­tères ne contenant aucun espace (con­trai­re­ment à la séquence « \s ») « RegEx Python »
  • « \S » ne cible pas cette chaîne, car elle contient un espace
\w Cible tous les ca­rac­tères al­pha­nu­mé­riques « 1abc$%3 »
  • « \w » trouve cinq cor­res­pon­dances pour 1, « a », « b », « c » et 3
\W Cible tous les ca­rac­tères n’étant pas al­pha­nu­mé­riques (con­trai­re­ment à la séquence « \w ») « 1abc$%3 »
  • « \W » trouve deux cor­res­pon­dances pour « $ » et « % »
\Z Cible la chaîne de ca­rac­tères spécifiée lorsqu’elle se trouve à la fin d’une chaîne « Python\Z »
  • Cible la chaîne « Python RegEx »
  • Ne cible pas la chaîne « Python et les RegEx »

Fonctions relatives à l’uti­li­sa­tion de Python RegEx

Pour utiliser des Python RegEx, vous pouvez faire appel à plusieurs fonctions pré­dé­fi­nies. Vous trouverez celles-ci dans un module Python nommé « re » ; il vous faudra donc l’importer avant de tra­vail­ler avec des ex­pres­sions ré­gu­lières :

import re
Python

re.findall()

La fonction findall() est la plus im­por­tante pour tirer parti des Python RegEx. À partir d’un modèle de recherche et d’une chaîne de ca­rac­tères Python, elle renvoie une liste Python ; composée de chaînes de ca­rac­tères, elle contient toutes les cor­res­pon­dances dans l’ordre dans lequel ces dernières ont été trouvées. Si elle ne relève aucune cor­res­pon­dance, la fonction findall renvoie une liste vide.

Vous trouverez ci-dessous un exemple de code per­met­tant d’illustrer cette fonction :

import re
string = "python 3.0"
regex = "\D"
résultat= re.findall(regex, string)
print(résultat)
Python

L’extrait de code ci-dessus permet d’importer le module « re » (comme nous vous l’avons déjà indiqué). La chaîne de ca­rac­tères python 3.0 est ensuite ren­seig­née dans la variable appelée « string ». Grâce au tableau des séquences, vous con­nais­sez déjà le modèle de recherche en­re­gis­tré dans la variable nommée « regex » : il cible tous les ca­rac­tères ne cor­res­pon­dant pas à des chiffres. Cette mise en cor­res­pon­dance s’effectue à l’aide de la fonction findall(), qui utilise le modèle de recherche et la chaîne de ca­rac­tères à analyser en tant que pa­ra­mètres de transfert. La liste ainsi renvoyée par la fonction atterrit dans la variable appelée « résultat » ; vous pouvez appeler la fonction print de Python pour l’afficher à l’écran. Le résultat se présente alors ainsi :

['p', 'y', 't', 'h', 'o', 'n', ' ', '. ']

La liste contient tous les ca­rac­tères de la chaîne, exception faite des chiffres. Attention : les espaces étant également con­si­dé­rées comme des ca­rac­tères, il est normal qu’elles ap­pa­rais­sent dans cette liste.

re.sub()

Avec la fonction sub(), vous pouvez remplacer toutes les cor­res­pon­dances par le texte de votre choix. À l’instar de findall(), celle-ci a recours à une ex­pres­sion régulière en tant que premier paramètre. Le texte par lequel vous souhaitez remplacer les cor­res­pon­dances doit quant à lui cons­ti­tuer le deuxième paramètre de transfert. Le troisième paramètre de la fonction cor­res­pond à la chaîne de ca­rac­tères à re­cher­cher. Si vous ne voulez remplacer toutes les cor­res­pon­dances, mais seulement certaines d’entre elles, il vous suffit de spécifier un quatrième paramètre de transfert ; il doit s’agir d’un nombre servant à indiquer les cor­res­pon­dances devant être rem­pla­cées (en com­men­çant par la première).

Pour mieux com­prendre la marche à suivre, étudiez l’exemple de code ci-dessous :

import re
string = "python est un excellent langage de programmation"
regex = "\s"
résultat1 = re.sub(regex, "0", string)
print(résultat1)
résultat2 = re.sub(regex, "0", string, 2)
print(résultat2)
Python

Le module appelé « re » est à nouveau importé, puis une chaîne de ca­rac­tères est spécifiée dans la variable string. À nouveau, vous con­nais­sez déjà le modèle de recherche qu’il convient d’appliquer ici : celui-ci cible toutes les espaces au sein d’une chaîne de ca­rac­tères.

Vous devez ensuite appeler deux fois la fonction sub, de façon assez similaire : le premier appel de fonction doit permettre de remplacer par un 0 toutes les espaces présentes dans la chaîne spécifiée, et d’en­re­gis­trer le résultat dans la variable nommée « résultat1 ». Le deuxième appel de fonction doit quant à lui permettre de limiter le nombre d’espaces à l’aide du quatrième paramètre de transfert (fa­cul­ta­tif). Ici, il est donc chargé de remplacer les deux premières espaces de la chaîne spécifiée par un 0 et d’en­re­gis­trer le résultat dans la variable appelée « résultat2 ».

Le résultat du code ci-dessus se présente alors de la manière suivante :

'python0estt0un0excellent0langagedeprogrammation'
'python0est0un excellent langage de programmation'

re.split()

Comme son nom l’indique, la fonction split() du module « re » rappelle le fonc­tion­ne­ment de la fonction split() intégrée à Python. Elle permet elle aussi de dé­com­po­ser une chaîne de ca­rac­tères en une liste. La chaîne de ca­rac­tères est donc in­ter­rom­pue à chacune de ses cor­res­pon­dances avec une ex­pres­sion régulière. Sans surprise, cette fonction requiert donc un modèle de recherche en tant que premier paramètre, ainsi que la chaîne de ca­rac­tères à frac­tion­ner en tant que deuxième paramètre. Pour limiter le nombre de frac­tion­ne­ments de votre chaîne, vous pouvez ajouter un nombre en tant que troisième paramètre (fa­cul­ta­tif). Celui-ci vous permet de spécifier le nombre maximal de frac­tion­ne­ments de votre chaîne. Laissez-nous vous présenter un autre exemple pour vous aider :

import re
string = "python est un excellent langage de programmation"
regex = "\s"
résultat1 = re.split(regex, string)
print(résultat1)
résultat2 = re.split(regex, string, 1)
print(résultat2)
Python

Le code de l’exemple précédent doit, en majeure partie, déjà vous être familier ; seul l’appel de la fonction split() a changé. La fonction split() est d’abord appelée au niveau de la chaîne de ca­rac­tères ; elle a pour mission de la frac­tion­ner chaque fois qu’une espace apparaît. La liste qui en résulte est ensuite affectée à la variable « résultat1 ». Le deuxième appel de split() limite à 1 le nombre de frac­tion­ne­ments, grâce au troisième paramètre fa­cul­ta­tif. Il affecte ensuite ce résultat à la variable « résultat2 ». Le programme ainsi exécuté donne le résultat qui suit :

['python', 'est', 'un', 'excellent', 'langage', 'de', 'programmation']
['python', 'est un excellent langage de programmation']

re.search()

La fonction search(), comme son nom l’indique, permet de re­cher­cher une cor­res­pon­dance au sein d’une chaîne de ca­rac­tères. Pour ce faire, elle utilise l’ex­pres­sion régulière en tant que premier paramètre et la chaîne à re­cher­cher en tant que deuxième paramètre. Elle renvoie un Python Match Object (soit un objet de cor­res­pon­dance), qui porte toujours sur la première cor­res­pon­dance trouvée. Si aucune cor­res­pon­dance n’est trouvée, la fonction renvoie alors la valeur « None ». Pour mieux com­prendre la marche à suivre avec cette fonction, vous pouvez vous référer à l’exemple ci-dessous :

import re
string = "python est un excellent langage de programmation"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx a été trouvée.")
else:
	print("RegEx n’a pas été trouvée.")
Python

La fonction search() est appelée avec une ex­pres­sion régulière per­met­tant de re­cher­cher les espaces, ainsi qu’avec une chaîne de ca­rac­tères. L’objet de cor­res­pon­dance renvoyé par l’appel de cette fonction atterrit dans la variable nommée « match ». L’ins­truc­tion if…else de Python, que vous trouverez ci-dessous, peut servir à illustrer la situation : si une cor­res­pon­dance est trouvée, l’objet de cor­res­pon­dance n’est pas vide et le chemin if est sé­lec­tionné. Sans surprise, le résultat renvoyé par le programme est alors le suivant :

'RegEx a été trouvée.'

L’objet de cor­res­pon­dance

L’objet de cor­res­pon­dance est renvoyé par un appel de search(). Il contient des in­for­ma­tions sur les oc­cur­rences iden­ti­fiées par le modèle de recherche. Dif­fé­rentes fonctions vous per­met­tent d’accéder à ces in­for­ma­tions :

  • La fonction object.start() renvoie l’index du premier caractère de la sous-chaîne Python cor­res­pon­dant à votre modèle de recherche.
  • La fonction object.end() renvoie l’index du dernier caractère, par analogie avec la fonction start().
  • La fonction object.span() combine les fonctions start() et end() : elle renvoie un tuplet en Python contenant le premier et le dernier index de la sous-chaîne concernée.
  • La fonction object.string renvoie la chaîne de ca­rac­tères analysée par vos soins.
  • La fonction object.re renvoie la Python RegEx spécifiée pour la fonction search().

Pour illustrer toutes ces fonctions, laissez-nous compléter le dernier de code par les appels de fonction cor­res­pon­dants :

import re
string = "python est un excellent langage de programmation"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx a été trouvée.")
else:
	print("RegEx n’a pas été trouvée.")
print(match.start())
print(match.end())
print(match.span())
print(match.string)
print(match.re())
Python

Le résultat du programme se présente alors de la manière suivante :

'RegEx a été trouvée.'
6
7
(6, 7)
'python est un excellent langage de programmation'
re.compile(’\\s’)

En premier lieu, la chaîne « RegEx a été trouvée. » est présente, car l’objet de cor­res­pon­dance n’est pas vide et la condition if s’applique en con­sé­quence. Ensuite, l’index de la première cor­res­pon­dance est affiché. Comme la première espace cor­res­pond à l’index « 6 », cette valeur n’est en rien sur­pre­nante. Il en va de même pour la valeur « 7 », affichée suite à l’appel de la fonction end(). Le n-uplet « (6, 7) » combine l’appel des fonctions start() et end(), avec les deux index indiqués en une seule fois. La chaîne de ca­rac­tères renvoyée par l’objet de cor­res­pon­dance en tant que résultat est elle aussi sans surprise.

Mais alors, qu’en est-il du résultat « re.compile(’\s’) » ? Il s’agit d’un objet lié aux Python RegEx. Celui-ci est créé si la chaîne de ca­rac­tères ren­seig­née en tant qu’ex­pres­sion régulière est traitée comme telle. Comme vous pouvez le voir, vous pouvez passer par votre objet de cor­res­pon­dance pour afficher l’objet lié aux RegEx.

Aller au menu principal