Skip to content

Python Regular Express Cheat Sheet (en anglais)

Nous vous suggérons de revoir cette solution dans un environnement contrôlé avant de la mettre en production, salutations.

Solution :

Expressions régulières

#

  1. Importez le module regex avec import re.
  2. Créez un objet Regex avec le module re.compile() . (N'oubliez pas d'utiliser une chaîne de caractères brute).
  3. Passez la chaîne de caractères que vous voulez rechercher dans la fonction search() de l'objet Regex. Cela renvoie une Match objet.
  4. Appelle la méthode de l'objet Match group() pour renvoyer une chaîne de caractères du texte réellement apparié.

Toutes les fonctions regex en Python se trouvent dans le module re :

import re

Correspondance d'objets Regex

#

phone_num_regex = re.compile(r'ddd-ddd-dddd')
mo = phone_num_regex.search('My number is 415-555-4242.')print('Phone number found: {}'.format(mo.group()))

Regroupement avec des parenthèses

#

phone_num_regex = re.compile(r'(ddd)-(ddd-dddd)')
mo = phone_num_regex.search('My number is 415-555-4242.')
mo.group(1)
mo.group(2)
mo.group(0)
mo.group()

Pour récupérer tous les groupes en une fois : utilisez la méthode groups() - notez le pluriel pour le nom.

mo.groups()
area_code, main_number = mo.groups()
print(area_code)
print(main_number)

Faire correspondre plusieurs groupes avec le tuyau.

#

Le caractère | est appelé un tuyau. Vous pouvez l'utiliser partout où vous souhaitez faire correspondre une expression parmi plusieurs. Par exemple, l'expression régulière r'Batman|Tina Fey' correspondra soit à 'Batman', soit à 'Tina Fey'.

hero_regex = re.compile(r'Batman|Tina Fey')
mo1 = hero_regex.search('Batman and Tina Fey.')
mo1.group()
mo2 = hero_regex.search('Tina Fey and Batman.')
mo2.group()

Vous pouvez également utiliser le pipe pour faire correspondre l'un de plusieurs motifs dans le cadre de votre regex :

bat_regex = re.compile(r'Bat(man|mobile|copter|bat)')
mo = bat_regex.search('Batmobile lost a wheel')
mo.group()
mo.group(1)

Correspondance optionnelle avec le point d'interrogation

#

Le caractère ? signale le groupe qui le précède comme une partie facultative du motif.

bat_regex = re.compile(r'Bat(wo)?man')
mo1 = bat_regex.search('The Adventures of Batman')
mo1.group()
mo2 = bat_regex.search('The Adventures of Batwoman')
mo2.group()

Correspondance de zéro ou plus avec l'étoile

#

Le * (appelé étoile ou astérisque) signifie " correspondre à zéro ou plus " - le groupe qui précède l'étoile peut apparaître un nombre quelconque de fois dans le texte.

bat_regex = re.compile(r'Bat(wo)*man')
mo1 = bat_regex.search('The Adventures of Batman')
mo1.group()
mo2 = bat_regex.search('The Adventures of Batwoman')
mo2.group()
mo3 = bat_regex.search('The Adventures of Batwowowowoman')
mo3.group()

Correspondance d'un ou plusieurs éléments avec le plus

#

Alors que * signifie " correspondre à zéro ou plus ", le + (ou plus) signifie " correspondre à un ou plusieurs ". Le groupe qui précède un plus doit apparaître au moins une fois. Il n'est pas facultatif :

bat_regex = re.compile(r'Bat(wo)+man')
mo1 = bat_regex.search('The Adventures of Batwoman')
mo1.group()
mo2 = bat_regex.search('The Adventures of Batwowowowoman')
mo2.group()
mo3 = bat_regex.search('The Adventures of Batman')
mo3 isNone

Correspondance de répétitions spécifiques avec des accolades

#

Si vous avez un groupe que vous voulez répéter un nombre spécifique de fois, faites suivre le groupe dans votre regex d'un nombre entre crochets. Par exemple, la regex (Ha){3} correspondra à la chaîne de caractères 'HaHaHa', mais elle ne correspondra pas à 'HaHa', puisque cette dernière n'a que deux répétitions du groupe (Ha).

Au lieu d'un seul nombre, vous pouvez spécifier une plage en écrivant un minimum, une virgule et un maximum entre les accolades. Par exemple, la regex (Ha){3,5} correspondra à 'HaHaHa', 'HaHaHaHa' et 'HaHaHaHaHa'.

ha_regex = re.compile(r'(Ha){3}')
mo1 = ha_regex.search('HaHaHa')
mo1.group()
mo2 = ha_regex.search('Ha')
mo2 isNone

Correspondance avide et non avide

#

Les expressions régulières de Python sont gourmandes par défaut, ce qui signifie que dans les situations ambiguës, elles correspondent à la chaîne la plus longue possible. La version non-greedy des accolades, qui correspond à la chaîne la plus courte possible, a l'accolade de fermeture suivie d'un point d'interrogation.

greedy_ha_regex = re.compile(r'(Ha){3,5}')
mo1 = greedy_ha_regex.search('HaHaHaHaHa')
mo1.group()
nongreedy_ha_regex = re.compile(r'(Ha){3,5}?')
mo2 = nongreedy_ha_regex.search('HaHaHaHaHa')
mo2.group()

La méthode findall

#

En plus de la méthode search(), les objets Regex possèdent également une méthode findall(). Alors que search() renvoie un objet Match du premier texte correspondant dans la chaîne recherchée, la méthode findall() renvoie les chaînes de chaque correspondance dans la chaîne recherchée.

phone_num_regex = re.compile(r'ddd-ddd-dddd')# has no groups
phone_num_regex.findall('Cell: 415-555-9999 Work: 212-555-0000')

Pour résumer ce que la méthode findall() renvoie, retenez ce qui suit :

  • Lorsqu'elle est appelée sur une regex sans groupe, telle que d-ddd-dddd, la méthode findall() renvoie une liste de ng correspondances, telle que ['415-555-9999', '212-555-0000'].

  • Lorsqu'elle est appelée sur une expression rationnelle comportant des groupes, telle que (ddd)-(dd)-(dddd), la méthode findall() renvoie une liste de chaînes de caractères (une chaîne de caractères pour chaque groupe), telle que [('415', '555', '9999'), ('212', '555', '0000')].

Créer vos propres classes de caractères

#

Il arrive que vous souhaitiez faire correspondre un ensemble de caractères mais que les classes de caractères sténographiques (d, w, s, et ainsi de suite) soient trop larges. Vous pouvez définir votre propre classe de caractères en utilisant des crochets. Par exemple, la classe de caractères [aeiouAEIOU] correspondra à n'importe quelle voyelle, aussi bien en minuscules qu'en majuscules.

vowel_regex = re.compile(r'[aeiouAEIOU]')
vowel_regex.findall('Robocop eats baby food. BABY FOOD.')

Vous pouvez également inclure des plages de lettres ou de chiffres en utilisant un trait d'union. Par exemple, la classe de caractères [a-zA-Z0-9] correspondra à toutes les lettres minuscules, les lettres majuscules et les chiffres.

En plaçant un signe d'insertion (^) juste après la parenthèse ouvrante de la classe de caractères, vous pouvez créer une classe de caractères négative. Une classe de caractères négative correspondra à tous les caractères qui ne sont pas dans la classe de caractères. Par exemple, entrez le texte suivant dans le shell interactif :

consonant_regex = re.compile(r'[^aeiouAEIOU]')
consonant_regex.findall('Robocop eats baby food. BABY FOOD.')

Les caractères Caret et Dollar

#

  • Vous pouvez également utiliser le symbole de l'escargot (^) au début d'une regex pour indiquer qu'une correspondance doit se produire au début du texte recherché.

  • De même, vous pouvez mettre un signe de dollar ($) à la fin de la regex pour indiquer que la chaîne doit se terminer par ce motif de regex.

  • Et vous pouvez utiliser le ^ et le $ ensemble pour indiquer que la chaîne entière doit correspondre à la regex - c'est-à-dire qu'il n'est pas suffisant qu'une correspondance soit faite sur un certain sous-ensemble de la chaîne.

La chaîne d'expression régulière r'^Hello' correspond aux chaînes de caractères qui commencent par 'Hello' :

begins_with_hello = re.compile(r'^Hello')
begins_with_hello.search('Hello world!')
begins_with_hello.search('He said hello.')isNone

La chaîne d'expression régulière r'd$' correspond aux chaînes qui se terminent par un caractère numérique de 0 à 9 :

whole_string_is_num = re.compile(r'^d+$')
whole_string_is_num.search('1234567890')
whole_string_is_num.search('12345xyz67890')isNone
whole_string_is_num.search('12 34567890')isNone

Le caractère générique

#

Le caractère . (ou point) dans une expression régulière est appelé un caractère générique et correspondra à n'importe quel caractère, à l'exception d'une nouvelle ligne :

at_regex = re.compile(r'.at')
at_regex.findall('The cat in the hat sat on the flat mat.')

Tout correspondre avec le point-étoile

#

name_regex = re.compile(r'First Name: (.*) Last Name: (.*)')
mo = name_regex.search('First Name: Some Last Name: One')
mo.group(1)
mo.group(2)

Le Dot-Star utilise le mode gourmand : Il essaiera toujours de faire correspondre le plus de texte possible. Pour faire correspondre tout le texte de manière non avide, utilisez le point, l'étoile et le point d'interrogation (.* ?). Le point d'interrogation indique à Python d'effectuer la correspondance de manière non avide :

nongreedy_regex = re.compile(r'<.*?>')
mo = nongreedy_regex.search(' for dinner.>')
mo.group()
greedy_regex = re.compile(r'<.*>')
mo = greedy_regex.search(' for dinner.>')
mo.group()

Correspondance des retours à la ligne avec le caractère point

#

Le point étoile correspondra à tout sauf à une nouvelle ligne. En passant re.DOTALL comme deuxième argument à re.compile(), vous pouvez faire en sorte que le caractère point corresponde à tous les caractères, y compris le caractère de nouvelle ligne :

no_newline_regex = re.compile('.*')
no_newline_regex.search('Serve the public trust.nProtect the innocent.nUphold the law.').group()
newline_regex = re.compile('.*', re.DOTALL)
newline_regex.search('Serve the public trust.nProtect the innocent.nUphold the law.').group()

Revue des symboles de la Regex

#

Symbole Correspond à
? zéro ou un des groupes précédents.
* zéro ou plus du groupe précédent.
+ un ou plusieurs du groupe précédent.
{n} exactement n du groupe précédent.
{n,} n ou plus du groupe précédent.
{,m} 0 à m du groupe précédent.
{n,m} au moins n et au plus m du groupe précédent.
{n,m}? ou *? ou +? effectue une correspondance non avenante du p précédent.
^spam signifie que la chaîne de caractères doit commencer par spam.
spam$ signifie que la chaîne de caractères doit se terminer par spam.
. tout caractère, sauf les caractères de nouvelle ligne.
d, wet s un chiffre, un mot ou un caractère d'espacement, respectivement.
D, W, et S tout sauf un chiffre, un mot ou un caractère d'espacement, respectivement.
[abc] tout caractère entre les parenthèses (tel que a, b, ).
[^abc] tout caractère qui n'est pas entre les parenthèses.

Correspondance insensible à la casse

#

Pour rendre votre regex insensible à la casse, vous pouvez passer re.IGNORECASE ou re.I comme deuxième argument à re.compile() :

robocop = re.compile(r'robocop', re.I)
robocop.search('Robocop is part man, part machine, all cop.').group()
robocop.search('ROBOCOP protects the innocent.').group()
robocop.search('Al, why does your programming book talk about robocop so much?').group()

Substitution de chaînes de caractères avec la méthode sub().

#

On passe deux arguments à la méthode sub() pour les objets Regex :

  1. Le premier argument est une chaîne de caractères pour remplacer toute correspondance.
  2. Le second est la chaîne de caractères de l'expression régulière.

La méthode sub() renvoie une chaîne de caractères avec les substitutions appliquées :

names_regex = re.compile(r'Agent w+')
names_regex.sub('CENSORED','Agent Alice gave the secret documents to Agent Bob.')

Un autre exemple :

agent_names_regex = re.compile(r'Agent (w)w*')
agent_names_regex.sub(r'1****','Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.')

Gestion des regex complexes

#

Pour indiquer à la fonction re.compile() d'ignorer les espaces blancs et les commentaires à l'intérieur de la chaîne d'expression régulière, on peut activer le "mode verbeux" en passant la variable re.VERBOSE comme deuxième argument de re.compile().

Maintenant, au lieu d'une expression régulière difficile à lire comme celle-ci :

phone_regex = re.compile(r'((d{3}|(d{3}))?(s|-|.)?d{3}(s|-|.)d{4}(s*(ext|x|ext.)s*d{2,5})?)')

vous pouvez répartir l'expression régulière sur plusieurs lignes avec des commentaires comme ceci :

phone_regex = re.compile(r'''(
    (d{3}|(d{3}))?            # area code
    (s|-|.)?                    # separator
    d{3}                         # first 3 digits
    (s|-|.)                     # separator
    d{4}                         # last 4 digits
    (s*(ext|x|ext.)s*d{2,5})?  # extension
    )''', re.VERBOSE)

Vous pouvez nous aider dans notre mission en postant un commentaire ou en laissant une note, nous vous en remercions.



Utilisez notre moteur de recherche

Ricerca
Generic filters

Laisser un commentaire

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