Syntaxe des expressions régulières¶
Une expression régulière (ou RE) spécifie un ensemble de chaînes qui lui correspond ; lesfonctions de ce module vous permettent de vérifier si une chaîne particulière correspond à une expression régulière donnée (ou si une expression régulière donnée correspond à une chaîne particulière, ce qui revient au même).
Les expressions régulières peuvent être concaténées pour former de nouvelles expressions régulières ; si Aet B sont toutes deux des expressions régulières, alors AB est aussi une expression régulière.En général, si une chaîne p correspond à A et une autre chaîne q correspond à B, la chaîne pq correspondra à AB. En général, si une chaîne p correspond à A et qu’une autre chaîne q correspond à B, la chaîne pq correspondra à AB. Ceci est vrai à moins que A ou B ne contiennent des opérations de faible précédence, des conditions limites entre A et B ou des références de groupe numérotées. Ainsi, des expressions complexes peuvent facilement être construites à partir d’expressions primitives plus simples comme celles décrites ici. Pour des détails sur la théorieet l’implémentation des expressions régulières, consultez le livre de Friedl ,ou presque n’importe quel manuel sur la construction de compilateurs.
Une brève explication du format des expressions régulières suit. Pour de plus amples informations et une présentation plus douce, consultez le HOWTO des expressions régulières.
Les expressions régulières peuvent contenir des caractères spéciaux et ordinaires. La plupart des caractères ordinaires, comme 'A'
, 'a'
ou '0'
, sont les expressions régulières les plus simples ; ils se correspondent simplement. Vous pouvez concaténer des caractères ordinaires, ainsi last
correspond à la chaîne 'last'
. (Dans le reste de cette section, nous écrirons les RE en this special style
, généralement sans guillemets, et les chaînes de caractères à faire correspondre 'in single quotes'
.)
Certains caractères, comme '|'
ou '('
, sont spéciaux. Les caractères spéciaux représentent soit des classes de caractères ordinaires, soit affectent la façon dont les expressions régulières qui les entourent sont interprétées.
Les qualificatifs de répétition (*
, +
, ?
, {m,n}
, etc) ne peuvent pas être imbriqués indirectement. Cela évite toute ambiguïté avec le suffixe modificateur non-répétitif?
, et avec d’autres modificateurs dans d’autres implémentations. Pour appliquer une deuxième répétition à une répétition interne, on peut utiliser des parenthèses. Par exemple, l’expression (?:a{6})*
correspond à tout multiple de six caractères 'a'
.
Les caractères spéciaux sont:
.
(Point.) Dans le mode par défaut, cela correspond à tout caractère sauf une nouvelle ligne. Si l’indicateur DOTALL
a été spécifié, cela correspond à n’importe quel caractère, y compris une nouvelle ligne.
^
(Caret.) Correspond au début de la chaîne, et en mode MULTILINE
correspond également immédiatement après chaque nouvelle ligne.
$
Correspond à la fin de la chaîne ou juste avant la nouvelle ligne à la fin de la chaîne, et en mode MULTILINE
correspond également avant une nouvelle ligne. L’expression régulière foo
correspond à la fois à ‘foo’ et à ‘foobar’, alors que l’expression régulière foo$
ne correspond qu’à ‘foo’. De manière plus intéressante, la recherche de foo.$
dans 'foo1\nfoo2\n'
correspond à ‘foo2’ normalement, mais à ‘foo1’ en mode MULTILINE
; la recherche d’une seule $
dans 'foo\n'
trouvera deux correspondances (vides) : une juste avant la nouvelle ligne, et une à la fin de la chaîne.
*
Fait en sorte que l’ER résultante corresponde à 0 ou plusieurs répétitions de l’ER précédente, autant de répétitions que possible. ab*
correspondra à ‘a’, ‘ab’, ou ‘a’ suivi de n’importe quel nombre de ‘b’.
+
Fait en sorte que l’ER résultant corresponde à 1 ou plusieurs répétitions de l’ER précédent.ab+
correspondra à ‘a’ suivi de n’importe quel nombre non nul de ‘b’ ; il ne correspondra pas seulement à ‘a’.
?
Fait en sorte que l’ER résultant corresponde à 0 ou 1 répétition de l’ER précédent.ab?
correspondra soit à ‘a’ soit à ‘ab’.
*?
,+?
,??
Les qualificateurs '*'
, '+'
et '?'
sont tous gourmands ; ils correspondent à autant de texte que possible. Parfois, ce comportement n’est pas souhaité ; si le RE<.*>
est mis en correspondance avec '<a> b <c>'
, il correspondra à l’intégralité de l’anneau, et pas seulement à '<a>'
. L’ajout de ?
après le qualificateur permet d’effectuer la correspondance de manière non avide ou minimale ; le moins de caractères possible seront comparés. L’utilisation de l’ER <.*?>
ne correspondra qu’à '<a>'
.
{m}
Précise qu’exactement m copies de l’ER précédent doivent être comparées ; quelques caractères font que l’ER entier ne correspond pas. Par exemple, a{6}
fera correspondre exactement six caractères 'a'
, mais pas cinq.
{m,n}
Fait correspondre l’ER résultant de m à n répétitions de l’ER précédent, en essayant de faire correspondre autant de répétitions que possible. Par exemple, a{3,5}
correspondra à 3 à 5 caractères 'a'
. L’omission de m spécifie une limite inférieure de zéro, et l’omission de n spécifie une limite supérieure infinie. À titre d’exemple, a{4,}b
correspondra à 'aaaab'
ou à mille caractères 'a'
suivis d’un 'b'
, mais pas à 'aaab'
. La virgule ne peut pas être omise ou le modificateur serait confondu avec la forme décrite précédemment.
{m,n}?
Fait en sorte que l’ER résultant corresponde à m à n répétitions de l’ER précédent, en essayant de correspondre au moins de répétitions possible. Il s’agit de la version non gourmande du qualificateur précédent. Par exemple, sur la chaîne de 6 caractères 'aaaaaa'
, a{3,5}
correspondra à 5 caractères 'a'
, tandis que a{3,5}?
ne correspondra qu’à 3 caractères.
\
Echappe les caractères spéciaux (ce qui vous permet de correspondre à des caractères comme'*'
, '?'
, et ainsi de suite), ou signale une séquence spéciale ; les séquences spéciales sont abordées ci-dessous.
Si vous n’utilisez pas une chaîne brute pour exprimer le motif, rappelez-vous que Python utilise également la barre oblique inverse comme séquence d’échappement dans les littéraux de chaîne ; si la séquence d’échappement n’est pas reconnue par l’analyseur syntaxique de Python, la barre oblique inverse et le caractère suivant sont inclus dans la chaîne résultante. Cependant, si Python reconnaît la séquence résultante, la barre oblique inverse doit être répétée deux fois. Ceci est compliqué et difficile à comprendre, il est donc fortement recommandé d’utiliser des chaînes de caractères pour toutes les expressions, sauf les plus simples.
Utilisé pour indiquer un ensemble de caractères. Dans un ensemble:
-
Les caractères peuvent être listés individuellement, par exemple
correspondra à
'a'
,'m'
, ou'k'
.
-
Des plages de caractères peuvent être indiquées en donnant deux caractères et en les séparant par un
'-'
, par exemplecorrespondra à toute lettre ASCII minuscule,
correspondra à tous les nombres à deux chiffres de
00
à59
, etcorrespondra à tout chiffre hexadécimal. Si
-
est échappé (par exemple) ou s’il est placé comme premier ou dernier caractère(par exemple
ou
), il correspondra à un
'-'
littéral. -
Les caractères spéciaux perdent leur signification spéciale à l’intérieur des ensembles. Par exemple,
correspondra à n’importe quel caractère littéral
'('
,'+'
,'*'
ou')'
.
-
Les classes de caractères telles que
\w
ou\S
(définies ci-dessous) sont également acceptées à l’intérieur d’un ensemble, bien que les caractères qu’elles correspondent dépendent du modeASCII
ouLOCALE
en vigueur.
-
Les caractères qui ne sont pas dans une plage peuvent être appariés en complétant l’ensemble. Si le premier caractère de l’ensemble est
'^'
, tous les caractères qui ne sont pas dans l’ensemble seront mis en correspondance. Par exemple,correspondra à tout caractère sauf
'5'
, etcorrespondra à tout caractère sauf
'^'
.^
n’a pas de signification particulière si ce n’est pas le premier caractère de l’ensemble. -
Pour faire correspondre un
']'
littéral à l’intérieur d’un ensemble, faites-le précéder d’une barre oblique inverse, ou placez-le au début de l’ensemble. Par exemple,{}]
et()
correspondent tous deux à une parenthèse.
-
La prise en charge des ensembles imbriqués et des opérations d’ensemble comme dans la norme technique Unicode #18 pourrait être ajoutée à l’avenir. Cela changerait la syntaxe, donc pour faciliter ce changement, un
FutureWarning
sera soulevé dans les cas ambigus pour le moment.Cela inclut les ensembles commençant par un littéral'
.(...)
Correspond à n’importe quelle expression régulière à l’intérieur des parenthèses, et indique le début et la fin d’un groupe ; le contenu d’un groupe peut être récupéré après qu’une correspondance ait été effectuée, et peut être corrigé plus tard dans la chaîne avec la séquence spéciale
\number
, décrite ci-dessous. Pour faire correspondre les littéraux'('
ou')'
, utilisez\(
ou\)
, ou enfermez-les dans une classe de caractères :,
.
(?...)
C’est une notation d’extension (un
'?'
suivant un'('
n’est pas significatif autrement). Le premier caractère après le'?'
détermine la signification et la syntaxe ultérieure de la construction. Les extensions ne créent généralement pas de nouveau groupe ;(?P<name>...)
est la seule exception à cette règle. Voici les extensions actuellement supportées.(?aiLmsux)
(Une ou plusieurs lettres de l’ensemble
'a'
,'i'
,'L'
,'m'
,'s'
,'u'
,'x'
). Le groupe correspond à la chaîne vide ; les lettres définissent les drapeaux correspondants :re.A
(correspondance ASCII uniquement),re.I
(ignorer la casse),re.L
(dépendant de la locale),re.M
(multi-ligne),re.S
(point correspond à tous),re.U
(correspondance Unicode), etre.X
(verbeux),pour l’ensemble de l’expression régulière.(Les drapeaux sont décrits dans Contenu du module.)Ceci est utile si vous souhaitez inclure les drapeaux comme partie de l’expression régulière, au lieu de passer un argument de drapeau à la fonctionre.compile()
. Les drapeaux doivent être utilisés en premier dans la chaîne d’expression.(?:...)
Une version non capturante des parenthèses régulières. Correspond à toute expression régulière se trouvant à l’intérieur des parenthèses, mais la sous-chaîne correspondant au groupe ne peut pas être récupérée après avoir effectué une correspondance ou référencée plus tard dans le motif.
(?aiLmsux-imsx:...)
(Zéro ou plusieurs lettres de l’ensemble
'a'
,'i'
,'L'
,'m'
,'s'
,'u'
,'x'
, éventuellement suivi de'-'
suivi d’une ou plusieurs lettres de l’ensemble'i'
,'m'
,'s'
,'x'
.)Les lettres définissent ou suppriment les drapeaux correspondants:re.A
(correspondance ASCII uniquement),re.I
(ignorer la casse),re.L
(dépendant de la locale),re.M
(multiligne),re.S
(point correspond à tous),re.U
(correspondance Unicode),etre.X
(verbeux), pour la partie de l’expression.(Les drapeaux sont décrits dans Contenu du module.)Les lettres
'a'
,'L'
et'u'
sont mutuellement exclusives lorsqu’elles sont utilisées comme drapeaux en ligne, elles ne peuvent donc pas être combinées ou suivre'-'
. Au lieu de cela, lorsque l’un d’entre eux apparaît dans un groupe en ligne, il remplace le mode de correspondance dans le groupe englobant. Dans les motifs Unicode,(?a:...)
passe à la correspondance ASCII uniquement, et(?u:...)
passe à la correspondance Unicode (par défaut). Dans les motifs d’octets(?L:...)
passe à la correspondance dépendant de la locale, et(?a:...)
passe à la correspondance ASCII uniquement (par défaut).Cette dérogation n’est en vigueur que pour le groupe inline étroit, et le mode de correspondance original est restauré en dehors du groupe.Nouveau dans la version 3.6.
Changé dans la version 3.7 : les lettres
'a'
,'L'
et'u'
peuvent également être utilisées dans un groupe.(?P<name>...)
Similaire aux parenthèses ordinaires, mais la sous-chaîne mise en correspondance par le groupe estaccessible via le nom symbolique du groupe. Les noms de groupe doivent être des identifiants Python valides, et chaque nom de groupe ne doit être défini qu’une seule fois dans une expression régulière. Un groupe symbolique est également un groupe numéroté, tout comme si le groupe n’était pas nommé.
Les groupes nommés peuvent être référencés dans trois contextes. Si le motif est
(?P<quote>).*?(?P=quote)
(c’est à dire correspondant à une chaîne de caractères citée avec des guillemets simples ou doubles) :Contexte de référence au groupe « quote »
Moyens de le référencer
dans le même motif lui-même
- .
-
(?P=quote)
(comme indiqué) -
lors du traitement de l’objet correspondant m
-
m.group('quote')
-
m.end('quote')
(etc.)
dans une chaîne passée au réargument de
re.sub()
-
\g<quote>
-
\g<1>
-
.
(?P=name)
Une référence arrière à un groupe nommé ; il correspond à tout texte auquel correspondait le groupe nommé antérieur.
(?#...)
Un commentaire ; le contenu des parenthèses est simplement ignoré.
(?=...)
Correspond si
...
correspond au suivant, mais ne consomme aucune partie de la chaîne. C’est ce qu’on appelle une assertion lookahead. Par exemple,Isaac (?=Asimov)
ne correspondra à'Isaac '
que si elle est suivie de'Asimov'
.(?!...)
Concorde si
...
ne correspond pas au suivant. C’est une assertion de lookahead négative.Par exemple,Isaac (?!Asimov)
ne correspondra à'Isaac '
que si elle n’est pas suivie de'Asimov'
.(?<=...)
Correspond si la position actuelle dans la chaîne est précédée d’une correspondance pour
...
qui se termine à la position actuelle. C’est ce qu’on appelle un lookbehindassertion positif.(?<=abc)def
trouvera une correspondance dans'abcdef'
, puisque le lookbehind remontera de 3 caractères et vérifiera si le motif contenu correspond.Le motif contenu ne doit correspondre qu’à des chaînes d’une certaine longueur fixe, ce qui signifie queabc
oua|b
sont autorisés, maisa*
eta{3,4}
ne le sont pas. Notez que les motifs qui commencent par des assertions positives de lookbehind ne correspondront pas au début de la chaîne recherchée ; vous voudrez probablement utiliser la fonctionsearch()
plutôt que la fonctionmatch()
:>>> import re>>> m = re.search('(?<=abc)def', 'abcdef')>>> m.group(0)'def'
Cet exemple recherche un mot suivant un trait d’union:
>>> m = re.search(r'(?<=-)\w+', 'spam-egg')>>> m.group(0)'egg'
Modifié dans la version 3.5 : Ajout de la prise en charge des références de groupe de longueur fixe.
(?<!...)
Rattache si la position actuelle dans la chaîne n’est pas précédée d’une correspondance pour
...
. Ceci est appelé une assertion lookbehind négative. Comme pour les assertions lookbehind positives, le motif contenu ne doit correspondre qu’à des chaînes d’une longueur fixe. Les motifs qui commencent par des assertions lookbehind négatives peuvent correspondre au début de la chaîne de caractères recherchée.(?(id/name)yes-pattern|no-pattern)
Essaie de correspondre avec
yes-pattern
si le groupe avec id ouname donné existe, et avecno-pattern
s’il n’existe pas.no-pattern
est facultatif et peut être omis. Par exemple,(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)
est un mauvais modèle de correspondance de courriel, qui correspondra à'<[email protected]>'
ainsi qu’à'[email protected]'
, mais pas à'<[email protected]'
ni à'[email protected]>'
.Les séquences spéciales consistent en
'\'
et un caractère de la liste ci-dessous.Si le caractère ordinaire n’est pas un chiffre ASCII ou une lettre ASCII, alors le RE résultant correspondra au deuxième caractère. Par exemple,$
correspond au caractère'$'
.\number
Correspond au contenu du groupe du même numéro. Les groupes sont numérotés à partir de 1. Par exemple,
(.+)
correspond à'the the'
ou'55 55'
, mais pas à'thethe'
(notez l’espace après le groupe). Cette séquence spéciale ne peut être utilisée que pour correspondre à l’un des 99 premiers groupes. Si le premier chiffre du numéro est 0, ou si le numéro est long de 3 chiffres octaux, il ne sera pas interprété comme une correspondance de groupe, mais comme le caractère avec la valeur octale numéro. À l’intérieur du''
d’une classe de caractères, tous les échappements numériques sont traités comme descaractères.\A
Correspond uniquement au début de la chaîne.
\b
Correspond à la chaîne vide, mais uniquement au début ou à la fin d’un mot.Un mot est défini comme une séquence de caractères de mot. Notez que formellement,
\b
est défini comme la limite entre un\w
et un caractère\W
(ou vice versa), ou entre\w
et le début/la fin de la chaîne.Cela signifie quer'\bfoo\b'
correspond à'foo'
,'foo.'
,'(foo)'
,'bar foo baz'
mais pas à'foobar'
ou'foo3'
.Par défaut, les caractères alphanumériques Unicode sont ceux utilisés dans les motifs Unicode, mais cela peut être modifié en utilisant le drapeau
ASCII
. Les limites des mots sont déterminées par la locale actuelle si le drapeauLOCALE
est utilisé.À l’intérieur d’une plage de caractères,\b
représente le caractère d’espacement arrière, pour la compatibilité avec les littéraux de chaîne de Python.\B
Correspond à la chaîne vide, mais seulement lorsqu’elle n’est pas au début ou à la fin d’un mot. Cela signifie que
r'py\B'
correspond à'python'
,'py3'
,'py2'
, mais pas à'py'
,'py.'
, ou'py!'
.\B
est juste l’opposé de\b
, donc les caractères de mot dans les modèles Unicode sont des caractères alphanumériques Unicode ou le trait de soulignement, bien que cela puisse être changé en utilisant le drapeauASCII
. Les limites des mots sont déterminées par la locale actuelle si le drapeauLOCALE
est utilisé.\d
Pour les motifs Unicode (str) :Rattache tout chiffre décimal Unicode (c’est-à-dire tout caractère de la catégorie de caractèresUnicode ). Cela inclut
, mais aussi de nombreux autres caractères numériques. Si l’indicateur
ASCII
est utilisé, seulest recherché.
Pour les motifs 8 bits (octets) :
Rattache tout chiffre décimal ; c’est l’équivalent de
.
\D
Rattache tout caractère qui n’est pas un chiffre décimal. C’est l’opposé de
\d
. Si l’indicateurASCII
est utilisé, cela devient l’équivalent de.
\s
Pour les motifs Unicode (str) :Rattache les caractères d’espacement Unicode (ce qui inclut
, mais aussi de nombreux autres caractères, par exemple les espaces de césure imposés par les règles de typographie dans de nombreuses langues). Si le drapeau
ASCII
est utilisé, seulest mis en correspondance.
Pour les motifs 8 bits (octets) :
Rattache les caractères considérés comme des espaces dans le jeu de caractères ASCII ; ceci est équivalent à
.
\S
Rattache tout caractère qui n’est pas un caractère d’espace. C’est l’opposé de
\s
. Si l’indicateurASCII
est utilisé, cela devient l’équivalent de.
\w
Pour les motifs Unicode (str) :Rattache les caractères de mot Unicode ; cela inclut la plupart des caractères qui peuvent faire partie d’un mot dans n’importe quelle langue, ainsi que les chiffres et le trait de soulignement. Si l’indicateur
ASCII
est utilisé, seulest recherché.
Pour les motifs 8 bits (octets) :
Rattache les caractères considérés comme alphanumériques dans le jeu de caractères ASCII;ceci est équivalent à
. Si le drapeau
LOCALE
est utilisé, correspond aux caractères considérés comme alphanumériques dans la locale actuelle et le trait de soulignement.\W
Correspond à tout caractère qui n’est pas un caractère de mot. C’est l’opposé de
\w
. Si le drapeauASCII
est utilisé, cela devient l’équivalent de. Si le drapeau
LOCALE
est utilisé, correspond aux caractères qui ne sont ni alphanumériques dans le local actuel ni le trait de soulignement.\Z
Correspond uniquement à la fin de la chaîne.
La plupart des échappements standard supportés par les littéraux de chaîne Python sont égalementacceptés par l’analyseur d’expressions régulières:
\a \b \f \n\N \r \t \u\U \v \x \
(Notez que
\b
est utilisé pour représenter les limites de mots, et signifie « backspace « uniquement à l’intérieur des classes de caractères.)'\u'
,'\U'
, et'\N'
séquences d’échappement ne sont reconnues que dans les motifs Unicode. Dans les motifs d’octets, elles constituent des erreurs. Les échappements inconnus des lettres ASCII sont réservés pour une utilisation future et traités comme des erreurs.Les échappements octaux sont inclus sous une forme limitée. Si le premier chiffre est un 0, ou s’il y a trois chiffres octaux, il est considéré comme un échappement octal. Sinon, il s’agit d’une référence de groupe. Comme pour les littéraux de chaîne de caractères, les échappements octaux ont toujours une longueur maximale de trois chiffres.
Changé dans la version 3.3 : Les séquences d’échappement
'\u'
et'\U'
ont été ajoutées.Changé dans la version 3.6 : Les échappatoires inconnues composées de
'\'
et d’une lettre ASCII sont désormais des erreurs.Changé dans la version 3.8 : La séquence d’échappement
'\N{name}'
a été ajoutée. Comme dans les littéraux de chaîne de caractères,elle se développe vers le caractère Unicode nommé (par exemple'\N{EM DASH}'
)..
-