4.2.1 Syntaxe des Expressions régulières

Une expression régulière (ou RE) spécifie un jeu de chaines de caractères qui lui correspondent ; Les fonctions de ce module vous permettent de vérifier si une chaine de caractères particulière correspond à une expression régulière donnée (ou si une expression régulière donnée correspond à une chaine de caractères 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 A et B sont deux expressions regulières, alors AB est aussi une expression régulière. Si une chaine p correspond à A et une chaine q correspond à B, la chaine pq doit correspondre à AB. Ainsi, les expressions complexes peuvent facilement être construites à partir de d'expressions plus simples comme celles décrites ici. Pour plus de détail dur la théorie et l'implémentation des expressions régulières, consulter le livre de Friedl référencé plus loin ou pratiquement tous les livres sur la construction de compilateur.

Une expliquation brève du format des expressions régulières va suivre. Pour plus d'informations et une présentation plus douce, consulter le document Regular Expression HOWTO accessible depuis http://www.python.org/doc/howto/.

Les expressions régulères peuvent contenir à la fois des caractères spéciaux et des caractères normaux. Les caractères ordinaires, comme "A", "a", ou "0", sont les expressions régulières les plus simples ; Ils correspondent simplement à eux-même. Il est possible de concaténer des caractères ordinaires, ainsi dernier correspond à la chaine de caractères 'dernier'. (Dans le reste de cette section, les RE seront écrites dans ce style, normalement sans guillemet, et les chaines de caractères 'dans des guillemets simples'.)

Certains caractères, comme "|" ou "(", sont speciaux. Les caractères spéciaux peuvent se présenter comme des caractères ordinaires ou affecter comment les expressions régulières sont interprétés.

Les caractères spéciaux sont :

0.7in 0.65in

"."
(Point.) Dans le mode par défaut, il représente n'importe quel caractère sauf un saut de ligne. Si le drapeau DOTALL a été spécifié, il représente n'importe quel caractères, le saut de ligne y compris.

"^"
(Accent circonflexe.) Représente le début d'une chaine de caractères, et dans le mode MULTILINE représente aussi le caractère immédiatement après chaque saut de ligne.

"$"
Représente la fin de la chaine de caractères, et dans le mode MULTILINE représente le caractère avant un saut de ligne. foo représente à la fois 'foo' et 'foobar', tandis que l'expression régulière foo$ représente seulement 'foo'.

"*"
Fait correspondre la RE résultante à une ou plusieurs répétitions de la RE précédente, avec autant de répétitions que possible. ab* correspondra à 'a', 'ab', ou 'a' suivi par n'importe quel nombre de 'b'.

"+"
Fait correspondre la RE résultante à une ou plusieurs répétitions de la RE précédente. ab+ correspondra à 'a' suivi par au moins un 'b' ; il ne correspondra pas à juste 'a'.

"?"
Fait correspondre la RE résultante à 0 ou 1 répétition de la RE précédente. ab? correspondra à 'a' ou 'ab'.
*?, +?, ??
Les qualificateurs "*", "+", et "?" sont tous gourmand; ils correspondent à autant de texte que possible. Quelquefois ce comportement n'est pas désiré ; si la RE <.*> est comparée à '<H1>title</H1>', il correspondra à la chaine entière, et non seulement à '<H1>'. Ajouter "?" après le qualificateur bascule la correspondance en mode non-gourmand ou minimale ; avec le moins de caractères possible. Utiliser .*? dans l'expression précédente donnera seulement '<H1>'.

{m,n}
Fait correspondre la RE résultante de m à n répétitions de la RE précédente, en essayant d'obtenir autant de répétitions que possible. Par exemple, a{3,5} correspondra de 3 à 5 caractères "a". Ne pas préciser n signifie une limite supérieure infinie ; On ne peut pas omettre m.

{m,n}?
Fait correspondre la RE résultante de m à n répétitions de la RE précédente, en essayant d'obtenir le moins de répétitions que possible. C'est la version non gourmande du qualificateur précédente. Par exemple, sur la chaine 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 (permet de spécifier des caractères comme "*", "?", et ainsi de suite), ou signale une séquence spéciale ; les séquences spéciales sont décrites plus bas.

Si on n'utilise pas une chaine de caractères brute pour représenter un motif, il faut se souvenir que Python utilise aussi le caractère backslash comme une séquence d'échappement dans une chaine de literaux ; si la séquence d'échappement n'est pas reconnue par le parser de Python, le backslash et le caractère suivant sont inclus dans la chaine de résultat. Cependant, si Python veut reconnaitre la séquence resultante, le backslash doit être répété deux fois. Ceci est compliqué et difficile à comprendre, C'est pourquoi il est hautement recommandé d'utiliser les chaines de caractères brutes pour tout sauf les expressions les plus simples.

[]
Utilisé pour indiquer un jeux de caractères. Les caractères peuvent être listés individuellement, ou un intervalle de caractères peut être indiqué en donnant deux caractères et en les séparant par un "-". Les caractères spéciaux ne sont pas actif à l'intérieur des jeux de caractères. Par exemple, [akm$] correspondra à n'improte quels caractères "a", "k", "m", ou "$" ; [a-z] correspondra à n'importe quelle lettre minuscule, et [a-zA-Z0-9] correspondra à n'importe quelle lettre ou chiffre. Les classes de caractères telles que \w ou \S (definies plus loin) sont aussi acceptées à l'intérieur d'un intervalle. Pour inclure un "]" ou un "-" à l'intérieur d'un jeux de caractères, il faut le faire précéder par un antislash, ou le placer en première position. Le motif []] correspondra à ']', par exemple.

Il est possible de trouver les caractères non compris dans un intervalle en complétant le jeux de caractères. Ceci est indiqué en incluant un "^" comme premier caractère ; "^" autre part correspondra simplement au caractère "^". Par exemple, [^5] trouvera n'importe quel caractère sauf "5".

"|"
A|B, où A et B peuvent être n'importe quelle RE, crée une expression régulière qui correspondra à A ou B. Un nombre arbitraire de RE peut être séparé par "|" de cette façon. Cela peut être utilisé à l'intérieur de groupes (voir plus loin). Les RE séparées par "|" sont éprouvés de gauche à droite, et le premier qui permet de trouver le motif complet est considéré comme la branche acceptée. Cela signifie que si A est trouvé, B ne sera jamais testé, même si il pourrait produire une correspondance plus complète. En d'autres mots, l'opérateur "|" n'est jamais gourmand. Pour trouver un littéral "|", utiliser \|, ou entourer le dans une classe de caractères, comme dans [|].

(...)
Trouve toutes les expressions régulières qui sont entre les parenthèses, et indique le début et la fin d'un groupe ; le contenu d'un groupe peut être retrouvé après qu'une correspondance ait été trouvé, et peut être trouvé plus tard dans la chaîne avec la séquence spéciale \number, décrite plus loin. Pour trouver les littéraux "(" ou ")", utiliser \( ou \), ou les inclure à l'intérieur d'une classe de caractères : [(] [)].

(?...)
C'est une extension de notation (un "?" suivant un "(" n'est pas significatif autrement). Le premier caractère après "?" détermine quelle est la signification et la syntaxe syntaxe de la construction. Les extensions ne crée habituellement de nouveau groupe ; (?P<name>...) est la seule exception à cette règle. Suivent les extensions actuellement supportées.

(?iLmsux)
(Une ou plusieurs lettres du jeux de caractères "i", "L", "m", "s", "u", "x".) Le groupe correspond à une chaine vide ; Les lettres posent les drapeaux correspondants (re.I, re.L, re.M, re.S, re.U, re.X) pour une expression régulière entière. C'est utile pour inclure les drapeaux comme partie d'une expression régulière, plutôt que de passer un argument flag à la fonction compile().

Il faut noter que la drapeau (?x) change la façon dont l'expression est parcourue. Il doit d'abord être utilisé dans une expression chaine, ou après un ou plusieurs caractères espaces. Si ce ne sont pas des caractères espaces avan le drapeau, les résultats sont indéfinis.

(?:...)
Une version non-groupée des parenthèses régulières. Correspond à n'importe quelle expression régulière entre les parenthèses, mais la sous-chaine trouvée par le groupe ne peut pas être retrouvée après exécution d'une correspondance ou référencée après dans le motif.

(?P<name>...)
Similaire aux parenthèses régulières, mais la sous-chaine trouvée par le groupe est accessible via le nom symbolic du groupe name. Les noms de groupe doivent être des identificateur Python valides. Un groupe symbolique est aussi un groupe numéroté, exactement comme si le groupe n'était pas nommé. Le groupe nommé 'id' dans l'exemple ci-dessus peut aussi être référencé comme le groupe numéro 1.

Par exemple, si le motif est (?P<id>[a-zA-Z_]\w*), le groupe peut être référencé par son nom dans les arguments des méthodes des objets trouvés, tels que m.group('id') ou m.end('id'), et aussi par le nom dans le texte du motif (e.g. (?P=id)) et le texte de remplacement (e.g. \g<id>).

(?P=name)
Trouve le texte qui a été trouvé par le précédent groupe nommé name.

(?#...)
Un commentaire ; le contenu des parenthèses est simplement ignoré.

(?=...)
Trouve si ... trouve la suite, mais ne consomme pas de cette chaîne de caractères. Ceci s'appelle une assertion lookahead. Par exemple, Isaac (?=Asimov) correspondra à 'Isaac~' seulement si c'est suivi de 'Asimov'.

(?!...)
Trouve si ... ne trouve pas la suite. C'est une assertion lookahead négative. Par exemple, Isaac (?!Asimov) correspondra à 'Isaac~' seulement si ce n'est pas suivi de 'Asimov'.

(?< =...)
Coorespond si la position actuelle dans la chaîne de caractères est précédée par une correspondance pour ... qui termine à la position actuelle. Ceci s'appelle une assertion lookbehind positive. (?<=abc)def correspondra à "abcdef", puisque le lookbehind sauvegardera 3 caractères et contrôle si le motif contenu correspond. Le motif contenu doit seulement correspondre aux chaînes de caractères d'une certaine longueur fixe, ce qui signifie que abc ou a|b sont permis, mais a* ne l'est pas.

(?<!...)
Correspond si la position actuelle dans la chaîne de caractères n'est pas précédée par une correpondance pour .... Ce qui s'appelle une affirmation lookbehind négative. Comme pour les assertions lookbehind positive, le motif contenu doit seulement correspondre à des chaînes de caractères de longueur fixée.

Les séquences spéciles se composent de "\" et un caractère de la liste ci-dessous. Si le caractère ordinaire n'est pas sur la liste, alors la RE résultante devra correspondre au deuxième caractère. Par exemple, \$ correspond au caractère "$".

0.7in 0.65in

number de \
Correspond au le contenu du groupe du même nombre. Les groupes sont numérotés à partir de 1. Par exemple, (.+) \1 correspond à 'the the' ou '55 55' , mais pas à 'the end' (note l'espace après le groupe). Cette séquence spéciale peut seulement être utilisé pour trouver un des 99 premiers groupes. Si le premier chiffre de number est 0, ou le number est un entier long octal de 3 chiffres, il ne sera pas interprété comme un groupe, mais comme caractère avec la valeur octale number. A l'intérieur des "[" et de "]" d'une classe de caractères, tous les échappements numériques sont traités comme caractères.

\A
Trouve uniquement au début de la chaine.

\b
Correspond à une chaîne de caractères vides, mais seulement au début ou à la fin d'un mot. Un mot est défini comme une séquence de caractères alphanumériques, ainsi la fin d'un mot est indiquée par un espace ou un caractère non-alphanumérique. À l'intérieur d'un intervalle de caractères, \b représente le caractère retour arrière, pour la compatibilité avec les chaines de caractères littérales de Python.

\B
Correspond à une chaine vide, mais seulement quand elle n'est pas au début ou à la fin d'un mot.

\d
Correspond à n'importe quel chiffre décimal ; c'est l'équivalent du jeux de caractères [0-9].

\D
Correspond à n'importe quel caractère non décimal ; c'est l'équivalent du jeux de caractères [^0-9].

\s
Correspond à n'importe quel caractère espace ; c'est l'équivalent du jeux de caractères [ \t\n\r\f\v].

\S
Correspond à n'importe quel caractère qui n'est pas un caractère espace ; c'est l'équivalent du jeux de caractères [^ \t\n\r\f\v].

\w
Quand les indicateurs LOCALE et UNICODE ne sont pas indiqués, correspond à n'importe quel caractère alphanumérique ; c'est l'équivalent qu jeux de caractères [a-zA-Z0-9_]. Avec LOCALE, il correspondra au jeux de caractères [0-9_] plus tous les caractères définis comme lettres pour la locale actuelle. Si UNICODE est positionné, ceci correspondra aux caractères [0-9_] plus tous les caractères classé comme alphanumériques dans la base de données de propriétés de caractère Unicode.

\W
Quand les indicateurs LOCALE et UNICODE ne sont pas indiqués, correspond à n'improte quel caractère non-alphanumérique ; c'est l'équivalent du jeux de caractères [^a-zA-Z0-9_]. Avec LOCALE, cela correspond à n'importe quel caractère qui n'est pas dans le jeux de caractères [0-9_], et non défini comme lettre pour la locale actuel. Si UNICODE est précisé, ceci correspondra à n'importe quoi d'autre que [0-9_] et les caractères marqués comme alphanumérique dans la base de données des caractères Unicode.

\Z
Correspond uniquement à la fin de la chaine.

\\
Correspond au littéral antislash.