Expressions régulières Python

Une expression régulière est une séquence spéciale de caractères qui vous aide à vérifier facilement si une chaîne correspond à un certain motif.

Python a ajouté le module re depuis la version 1.5, qui fournit des motifs d'expressions régulières de style Perl.

Le module re offre au langage Python toutes les fonctionnalités des expressions régulières.

La fonction compile génère un objet d'expression régulière à partir d'une chaîne de motif et de paramètres d'indicateurs optionnels. Cet objet possède une série de méthodes pour la correspondance et le remplacement d'expressions régulières.

Le module re fournit également des fonctions entièrement cohérentes avec les fonctionnalités de ces méthodes. Ces fonctions utilisent une chaîne de motif comme premier paramètre.

Ce chapitre présente principalement les fonctions de traitement des expressions régulières couramment utilisées en Python.


Fonction re.match

re.match tente de faire correspondre un motif depuis le début de la chaîne. Si la correspondance n'est pas réussie à la position de départ, match() renvoie None.

Syntaxe de la fonction:

re.match(pattern, string, flags=0)

Description des paramètres de la fonction :

ParamètreDescription
patternL'expression régulière à faire correspondre.
stringLa chaîne à faire correspondre.
indicateursIndicateurs, utilisés pour contrôler le mode de correspondance de l'expression régulière, tels que : sensibilité à la casse, correspondance multiligne, etc. Voir :Modificateurs d'expression régulière - Indicateurs facultatifs

Si la correspondance est réussie, la méthode re.match renvoie un objet de correspondance, sinon elle renvoie None.

Nous pouvons utiliser les fonctions group(num) ou groups() de l'objet de correspondance pour obtenir l'expression correspondante.

Méthodes de l'objet de correspondanceDescription
group(num=0)La chaîne de toute l'expression correspondante. group() peut prendre plusieurs numéros de groupe à la fois, auquel cas il renvoie un tuple contenant les valeurs correspondant à ces groupes.
groups()Renvoie un tuple contenant toutes les chaînes des sous-groupes, de 1 au nombre de sous-groupes contenus.

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.match('www', 'www.example.com').span()) # Correspond au début print(re.match('com', 'www.example.com')) # Ne correspond pas au début

La sortie de l'exemple ci-dessus est :

(0, 3)
None

Exemple

#!/usr/bin/python import re line = "Les chats sont plus intelligents que les chiens" matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "Aucune correspondance !!"

Le résultat de l'exemple ci-dessus est le suivant :

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

méthode re.search

re.search parcourt toute la chaîne et renvoie la première correspondance réussie.

Syntaxe de la fonction :

re.search(pattern, string, flags=0)

Description des paramètres de la fonction :

ParamètreDescription
patternL'expression régulière à faire correspondre.
stringLa chaîne à faire correspondre.
indicateursOptions, utilisées pour contrôler la méthode de correspondance de l'expression régulière, telles que : sensibilité à la casse, correspondance multiligne, etc.

Si la correspondance est réussie, la méthode re.search renvoie un objet de correspondance, sinon elle renvoie None.

Nous pouvons utiliser les fonctions group(num) ou groups() de l'objet de correspondance pour obtenir l'expression correspondante.

Méthodes de l'objet de correspondanceDescription
group(num=0)La chaîne de toute l'expression correspondante. group() peut prendre plusieurs numéros de groupe à la fois, auquel cas il renvoie un tuple contenant les valeurs correspondant à ces groupes.
groups()Renvoie un tuple contenant toutes les chaînes des sous-groupes, de 1 au nombre de sous-groupes contenus.

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.search('www', 'www.example.com').span()) # Correspond au début print(re.search('com', 'www.example.com').span()) # Aucune correspondance au début

La sortie de l'exemple ci-dessus est :

(0, 3)
(11, 14)

Exemple

#!/usr/bin/python import re line = "Les chats sont plus intelligents que les chiens"; searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) if searchObj: print "searchObj.group() : ", searchObj.group() print "searchObj.group(1) : ", searchObj.group(1) print "searchObj.group(2) : ", searchObj.group(2) else: print "Rien trouvé !!"
Le résultat de l'exemple ci-dessus est le suivant :
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

Différence entre re.match et re.search

re.match ne correspond qu'au début de la chaîne. Si le début de la chaîne ne correspond pas à l'expression régulière, la correspondance échoue et la fonction renvoie None ; tandis que re.search parcourt toute la chaîne jusqu'à ce qu'une correspondance soit trouvée.

Exemple

#!/usr/bin/python import re line = "Les chats sont plus intelligents que les chiens"; matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print "correspondance --> matchObj.group() : ", matchObj.group() else: print "Aucune correspondance !!" matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print "search --> searchObj.group() : ", matchObj.group() else: print "Aucune correspondance !!"
La sortie de l'exemple ci-dessus est la suivante :
No match!!
search --> searchObj.group() :  dogs

Rechercher et remplacer

Le module re de Python fournit re.sub pour remplacer les correspondances dans une chaîne.

Syntaxe :

re.sub(pattern, repl, string, count=0, flags=0)

Paramètres :

  • pattern : La chaîne de motif dans l'expression régulière.
  • repl : La chaîne de remplacement, peut aussi être une fonction.
  • string : La chaîne d'origine à rechercher et remplacer.
  • count : Le nombre maximum de remplacements après correspondance du motif, la valeur par défaut 0 signifie remplacer toutes les correspondances.

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- import re phone = "2004-959-559 # Ceci est un numéro de téléphone étranger" # Supprimer les commentaires Python dans la chaîne num = re.sub(r'#.*$', "", phone) print "Le numéro de téléphone est :", num # Supprimer les chaînes non numériques (-) num = re.sub(r'\D', "", phone) print "Le numéro de téléphone est:", num
Le résultat de l'exemple ci-dessus est le suivant :
电话号码是:  2004-959-559 
电话号码是 :  2004959559

Le paramètre repl est une fonction

Dans l'exemple suivant, les nombres correspondants dans la chaîne sont multipliés par 2:

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- import re # Multiplier les nombres correspondants par 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))

La sortie après exécution est :

A46G8HFD1134

Fonction re.compile

La fonction compile est utilisée pour compiler une expression régulière et générer un objet d'expression régulière (Pattern), qui peut être utilisé par des fonctions telles que match(), search() et findall().

Le format de syntaxe est:

re.compile(pattern[, flags])

Paramètres :

  • pattern: Une expression régulière sous forme de chaîne

  • flags: Facultatif, représentant le mode de correspondance, comme ignorer la casse, le mode multiligne, etc. Les paramètres spécifiques sont :

    1. re.IIgnorer la casse
    2. re.LIndique que les jeux de caractères spéciaux \w, \W, \b, \B, \s, \S dépendent de l'environnement actuel
    3. re.MMode multiligne
    4. re.SC'est-à-dire.Et tout caractère, y compris le saut de ligne (.Sauf le saut de ligne)
    5. re.UIndique que les jeux de caractères spéciaux \w, \W, \b, \B, \d, \D, \s, \S dépendent de la base de données des propriétés des caractères Unicode
    6. re.XPour améliorer la lisibilité, ignorer les espaces et#les commentaires après

Exemple

Exemple

>>>import re >>> pattern = re.compile(r'\d+') # Utilisé pour correspondre à au moins un chiffre >>> m = pattern.match('one12twothree34four') # Rechercher au début, aucune correspondance >>> print m None >>> m = pattern.match('one12twothree34four', 2, 10) # Commencer la correspondance à partir de la position 'e', aucune correspondance >>> print m None >>> m = pattern.match('one12twothree34four', 3, 10) # Commencer la correspondance à partir de la position '1', correspond exactement >>> print m # Renvoie un objet Match <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 0 peut être omis '12' >>> m.start(0) # 0 peut être omis 3 >>> m.end(0) # 0 peut être omis 5 >>> m.span(0) # 0 peut être omis (3, 5)

Ci-dessus, lors d'une correspondance réussie, un objet Match est renvoyé, où :

  • group([group1, …])La méthode est utilisée pour obtenir la chaîne mise en correspondance par un ou plusieurs groupes. Lorsque vous voulez obtenir toute la sous-chaîne correspondante, vous pouvez directement utilisergroup()ougroup(0);
  • start([group])La méthode est utilisée pour obtenir la position de début de la sous-chaîne mise en correspondance par un groupe dans la chaîne entière (l'index du premier caractère de la sous-chaîne), avec une valeur de paramètre par défaut de 0;
  • end([group])La méthode est utilisée pour obtenir la position de fin de la sous-chaîne mise en correspondance par un groupe dans la chaîne entière (l'index du dernier caractère de la sous-chaîne + 1), avec une valeur de paramètre par défaut de 0;
  • span([group])La méthode renvoie(start(group), end(group))。

Regardons un autre exemple :

Exemple

>>>import re >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I signifie ignorer la casse >>> m = pattern.match('Hello World Wide Web') >>> print m # Correspondance réussie, renvoie un objet Match <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # Renvoie toute la sous-chaîne correspondante 'Hello World' >>> m.span(0) # Renvoie l'indice de toute la sous-chaîne correspondante (0, 11) >>> m.group(1) # Renvoie la sous-chaîne correspondant au premier groupe 'Hello' >>> m.span(1) # Renvoie l'indice de la sous-chaîne correspondant au premier groupe (0, 5) >>> m.group(2) # Renvoie la sous-chaîne correspondant au deuxième groupe 'World' >>> m.span(2) # Renvoie la sous-chaîne correspondant au deuxième groupe (6, 11) >>> m.groups() # Équivalent à (m.group(1), m.group(2), ...) ('Hello', 'World') >>> m.group(3) # Aucun troisième groupe n'existe Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: pas de tel groupe

findall

Trouve toutes les sous-chaînes correspondant à l'expression régulière dans la chaîne et renvoie une liste. S'il y a plusieurs motifs correspondants, il renvoie une liste de tuples. Si aucune correspondance n'est trouvée, il renvoie une liste vide.

Remarque :match et search ne correspondent qu'une fois, tandis que findall trouve toutes les correspondances.

Le format de syntaxe est:

findall(string[, pos[, endpos]])

Paramètres :

  • string: La chaîne à mettre en correspondance.
  • pos: Paramètre facultatif, indique la position de début de la chaîne, vaut 0 par défaut.
  • endpos: Paramètre facultatif, indique la position de fin de la chaîne, vaut par défaut la longueur de la chaîne.

Trouver tous les nombres dans la chaîne :

Exemple

# -*- coding:UTF8 -*- import re pattern = re.compile(r'\d+') # Trouver les nombres result1 = pattern.findall('example 123 google 456') result2 = pattern.findall('run88oob123google456', 0, 10) print(result1) print(result2)

Résultat de sortie :

['123', '456']
['88', '12']

Plusieurs motifs correspondants, renvoie une liste de tuples :

Exemple

import re

result = re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
print(result)
[('width', '20'), ('height', '10')]

re.finditer

Semblable à findall, trouve toutes les sous-chaînes correspondant à l'expression régulière dans la chaîne et les renvoie sous forme d'itérateur.

re.finditer(pattern, string, flags=0)

Paramètres :

ParamètreDescription
patternL'expression régulière à faire correspondre.
stringLa chaîne à faire correspondre.
indicateursIndicateurs, utilisés pour contrôler le comportement de correspondance de l'expression régulière, comme la sensibilité à la casse, la correspondance multiligne, etc. Voir :Modificateurs d'expression régulière - indicateurs facultatifs

Exemple

# -*- coding: UTF-8 -*- import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() )

Résultat de sortie :

12 
32 
43 
3

re.split

La méthode split divise la chaîne selon les sous-chaînes qui peuvent être mises en correspondance et renvoie une liste. Sa forme d'utilisation est la suivante :

re.split(pattern, string[, maxsplit=0, flags=0])

Paramètres :

ParamètreDescription
patternL'expression régulière à faire correspondre.
stringLa chaîne à faire correspondre.
maxsplitNombre maximal de divisions. maxsplit=1 signifie diviser une fois. La valeur par défaut est 0, ce qui signifie aucune limite.
indicateursIndicateurs, utilisés pour contrôler le comportement de correspondance de l'expression régulière, comme la sensibilité à la casse, la correspondance multiligne, etc. Voir :Modificateurs d'expression régulière - indicateurs facultatifs

Exemple

>>>import re >>> re.split('\W+', 'exemple, exemple, exemple.') ['exemple', 'exemple', 'exemple', ''] >>> re.split('(\W+)', ' exemple, exemple, exemple.') ['', ' ', 'exemple', ', ', 'exemple', ', ', 'exemple', '.', ''] >>> re.split('\W+', ' exemple, exemple, exemple.', 1) ['', 'exemple, exemple, exemple.'] >>> re.split('a*', 'bonjour le monde') # Pour une chaîne qui ne trouve pas de correspondance, split ne la divisera pas ['bonjour le monde']

Objet d'expression régulière

re.RegexObject

re.compile() renvoie un objet RegexObject.

re.MatchObject

group() renvoie la chaîne correspondant à l'expression régulière.

  • start()Renvoie la position de début de la correspondance
  • end()Renvoie la position de fin de la correspondance
  • span()Renvoie un tuple contenant les positions (start, end) de la correspondance

Modificateurs d'expressions régulières - Drapeaux facultatifs

Les expressions régulières peuvent contenir des modificateurs de drapeau facultatifs pour contrôler le motif de correspondance. Les modificateurs sont spécifiés sous la forme d'un drapeau facultatif. Plusieurs drapeaux peuvent être spécifiés en les combinant par OU bit à bit (|). Par exemple, re.I | re.M définit à la fois les drapeaux I et M :

ModificateurDescription
re.IRend la correspondance insensible à la casse
re.LEffectue une correspondance tenant compte de la locale
re.MCorrespondance multiligne, affecte ^ et $
re.SFait correspondre . à tous les caractères, y compris le saut de ligne.
re.UAnalyse les caractères selon le jeu de caractères Unicode. Cet indicateur affecte \w, \W, \b, \B.
re.XCet indicateur offre un format plus flexible, ce qui vous permet d'écrire des expressions régulières plus faciles à comprendre.

Motifs d'expressions régulières

Les chaînes de motif utilisent une syntaxe spéciale pour représenter une expression régulière :

Les lettres et les chiffres se représentent eux-mêmes. Les lettres et les chiffres dans un motif d'expression régulière correspondent aux mêmes chaînes.

La plupart des lettres et des chiffres ont une signification différente lorsqu'ils sont précédés d'une barre oblique inverse.

Les caractères de ponctuation ne correspondent à eux-mêmes que lorsqu'ils sont échappés ; sinon, ils représentent des significations spéciales.

La barre oblique inverse elle-même doit être échappée avec une barre oblique inverse.

Comme les expressions régulières contiennent souvent des barres obliques inverses, il vaut mieux utiliser des chaînes brutes pour les représenter. Les éléments de motif (tels que r'\t', équivalent à '\\t') correspondent aux caractères spéciaux correspondants.

Le tableau suivant répertorie les éléments spéciaux de la syntaxe des motifs d'expressions régulières. Si vous fournissez des paramètres d'indicateurs facultatifs lors de l'utilisation d'un motif, la signification de certains éléments de motif peut changer.

ModèleDescription
^Correspond au début de la chaîne.
$Correspond à la fin de la chaîne.
.Correspond à tout caractère sauf le saut de ligne. Lorsque l'indicateur re.DOTALL est spécifié, il peut correspondre à n'importe quel caractère, y compris le saut de ligne.
[...]Utilisé pour représenter un ensemble de caractères, listés individuellement : [amk] correspond à 'a', 'm' ou 'k'
[^...]Caractères qui ne sont pas dans [] : [^abc] correspond à tout caractère sauf a, b, c.
re*Correspond à zéro ou plusieurs occurrences de l'expression.
re+Correspond à une ou plusieurs occurrences de l'expression.
re?Correspond à 0 ou 1 occurrence du fragment défini par l'expression régulière précédente, de manière non gourmande
re{ n}Correspond exactement à n occurrences de l'expression précédente. Par exemple,o{2}Il ne peut pas correspondre au 'o' dans "Bob", mais il peut correspondre aux deux 'o' dans "food".
re{ n,}Correspond à n occurrences ou plus de l'expression précédente. Par exemple, o{2,} ne peut pas correspondre au 'o' dans "Bob", mais il peut correspondre à tous les 'o' dans "foooood". "o{1,}" équivaut à "o+". "o{0,}" équivaut à "o*".
re{ n, m}Correspond à un nombre d'occurrences compris entre n et m du fragment défini par l'expression régulière précédente, de manière gourmande
a| bCorrespond à a ou b
(re)Groupe l'expression régulière et mémorise le texte correspondant
(?imx)Une expression régulière contient trois options facultatives : i, m ou x. Affecte uniquement la zone à l’intérieur des parenthèses.
(?-imx)L’expression régulière désactive les options facultatives i, m ou x. Affecte uniquement la zone à l’intérieur des parenthèses.
(?: re)Semblable à (...), mais ne représente pas un groupe
(?imx: re)Utilise les options facultatives i, m ou x à l’intérieur des parenthèses
(?-imx: re)N’utilise pas les options facultatives i, m ou x à l’intérieur des parenthèses
(?#...)Commentaire.
(?= re)Assertion positive d’anticipation. Si l’expression régulière contenue, représentée par ..., correspond avec succès à la position actuelle, elle réussit ; sinon, elle échoue. Mais une fois que l’expression contenue a été tentée, le moteur de correspondance n’avance pas ; le reste du motif doit encore être essayé à droite de l’assertion.
(?! re)Assertion d'anticipation négative. Opposée de l'assertion positive ; réussit lorsque l'expression contenue ne peut pas correspondre à la position actuelle dans la chaîne.
(?> re)Correspond à un motif indépendant, éliminant le retour arrière.
\wCorrespond aux lettres, aux chiffres et aux traits de soulignement
\WCorrespond à tout, sauf aux lettres, aux chiffres et aux traits de soulignement
\sCorrespond à tout caractère d'espacement, équivalent à[ \t\n\r\f]。
\SCorrespond à tout caractère autre qu'un caractère d'espacement
\dCorrespond à tout chiffre, équivalent à [0-9].
\DCorrespond à tout non-chiffre
\ACorrespond au début de la chaîne
\ZCorrespond à la fin de la chaîne. S'il y a un saut de ligne, il ne correspond qu'à la fin de la chaîne avant le saut de ligne.
\zCorrespond à la fin de la chaîne
\GCorrespond à la position où la dernière correspondance s'est terminée.
\bCorrespond à une limite de mot, c'est-à-dire la position entre un mot et un espace. Par exemple, 'er\b' peut correspondre au 'er' dans "never", mais ne peut pas correspondre au 'er' dans "verb".
\BCorrespond à une limite de non-mot. 'er\B' peut correspondre au 'er' dans "verb", mais ne peut pas correspondre au 'er' dans "never".
\n, \t, etc.Correspond à un caractère de nouvelle ligne. Correspond à un caractère de tabulation. etc.
\1...\9Correspond au contenu du n-ième groupe.
\10Correspond au contenu du n-ième groupe si celui-ci a été mis en correspondance. Sinon, cela fait référence à une expression de code de caractère octal.

Exemples d'expressions régulières

Correspondance de caractères

ExempleDescription
pythonCorrespond à "python".

Classes de caractères

ExempleDescription
[Pp]ython Correspond à « Python » ou « python »
rub[ye]Correspond à « ruby » ou « rube »
[aeiou]Correspond à une lettre quelconque entre les crochets
[0-9]Correspond à n'importe quel chiffre. Similaire à
[a-z]Correspond à n'importe quelle lettre minuscule
[A-Z]Correspond à n'importe quelle lettre majuscule
[a-zA-Z0-9]Correspond à n'importe quelle lettre et chiffre
[^aeiou]Tous les caractères sauf les lettres aeiou
[^0-9]Correspond aux caractères autres que les chiffres

Classes de caractères spéciaux

ExempleDescription
.Correspond à tout caractère unique sauf "\n". Pour correspondre à n'importe quel caractère, y compris '\n', utilisez un motif comme '[.\n]'.
\dCorrespond à un chiffre. Équivalent à [0-9].
\D Correspond à un caractère autre qu'un chiffre. Équivalent à [^0-9].
\sCorrespond à tout caractère d'espacement, y compris l'espace, la tabulation, le saut de page, etc. Équivalent à [ \f\n\r\t\v].
\S Correspond à tout caractère qui n'est pas un caractère d'espacement. Équivalent à [^ \f\n\r\t\v].
\wCorrespond à tout caractère de mot, y compris le trait de soulignement. Équivalent à '[A-Za-z0-9_]'.
\WCorrespond à tout caractère qui n'est pas un caractère de mot. Équivalent à '[^A-Za-z0-9_]'.
Autres extensions