Module RegEx
Python possède un module intégré appelé re , qui peut être utilisé pour travailler avec des Expressions Régulières.
Pour importer le module re :
import re
L'utilisation des expressions régulières peut commencer dès que vous avez importé le module re :
Exemple Recherchez la chaîne de caractères "expressions" :
📋 Copier le code
import re
match = re.search(r"expressions", "Avec oujood \ apprendre les expressions régulières de python")
print(match)
print(match.group())
print("Index de depart :", match.start())
print("Index de fin :", match.end())
La sortie est :
<re.Match object; span=(26, 37), match="expressions">
expressions
Index de depart : 26
Index de fin : 37
Dans cet exemple, le caractère r (r"expressions") signifie brut, et non RegEx. La chaîne brute est légèrement différente d'une chaîne régulière, elle n'interprète pas le caractère \ comme un caractère d'échappement. Cela est dû au fait que le moteur d'expression régulière utilise le caractère \ pour son propre usage d'échappement.
Avant de commencer à utiliser le module Python regex, voyons comment écrire des RegEx en utilisant des métacaractères ou des séquences spéciales.
Les métacaractères
Pour comprendre l'analogie RE, les MetaCharacters sont utiles, importants, et seront utilisés dans les fonctions du module re.
Voici la liste des metaCharacters.
MetaCharacters | Description | Exemple |
\ | Utilisé pour supprimer la signification spéciale du caractère qui le suit. | "\d" |
[] | Représente une famille de caractères | "[a-m]" |
^ | Débute par le début | "^bon" |
$ | Se termine par | "planet$" |
. | Correspond à n'importe quel caractère sauf le saut de ligne | "bo..j" |
| | Signifie OU (Correspond à n'importe lequel des caractères séparés par lui. | "falls|stays" |
? | Correspond à zéro ou une occurrence | "he.?o" |
{} | Indiquez le nombre d'occurrences d'une RegEx précédente à mettre en correspondance. | "he.{2}o" |
* | Tout nombre d'occurrences (y compris 0 occurrence) | "he.*o" |
+ | Une ou plusieurs occurrences | "he.+o" |
() | Encadrer un groupe de RegEx | |
Séquences spéciales
Les séquences spéciales ne correspondent pas au caractère réel de la chaîne, mais indiquent l'emplacement spécifique dans la chaîne de recherche où la correspondance doit avoir lieu. Elles permettent d'écrire plus facilement les modèles courants.
Liste des séquences spéciales
Caractère | Description | Exemple |
\A | Renvoie une correspondance si les caractères spécifiés sont au début de la chaîne de caractères. | "\AThe" |
\b | Renvoie une correspondance lorsque les caractères spécifiés se trouvent au début ou à la fin d'un mot. | r"\bain"
r"ain\b" |
\B | Renvoie une correspondance lorsque les caractères spécifiés sont présents, mais PAS au début (ou à la fin) d'un mot. | r"\Bain"
r"ain\B" |
\d | Renvoie une correspondance lorsque la chaîne contient des chiffres (chiffres de 0 à 9). | "\d" |
\D | Renvoie une correspondance pour laquelle la chaîne NE contient PAS de chiffres. | "\D" |
\s | Renvoie une correspondance lorsque la chaîne contient un caractère d'espace blanc. | "\s" |
\S | Renvoie une correspondance où la chaîne NE contient PAS de caractère d'espace blanc. | "\S" |
\w | Renvoie une correspondance où la chaîne contient des caractères de mot (caractères de a à Z, chiffres de 0 à 9 et le caractère de soulignement _). | "\w" |
\W | Renvoie une correspondance où la chaîne NE contient PAS de caractères de mot. | "\W" |
\Z | Renvoie une correspondance si les caractères spécifiés se trouvent à la fin de la chaîne. | "Spain\Z" |
Le "r" au début de l'expression permet de s'assurer que la chaîne est traitée comme une "chaîne brute".
Les ensembles
Un ensemble est un ensemble de caractères à l'intérieur d'une paire de crochets [ ] avec une signification particulière :
Ensemble | Description |
[arn] | Renvoie une correspondance où l'un des caractères spécifiés (a, r ou n) est présent. |
[a-n] | Renvoie une correspondance pour tout caractère minuscule, dans l'ordre alphabétique entre a et n. |
[^arn] | Recherche tout caractère SAUF a, r et n. |
[0123] | Recherche une correspondance si l'un des chiffres spécifiés (0, 1, 2 ou 3) est présent. |
[0-9] | Recherche une correspondance pour tout chiffre compris entre 0 et 9. |
[0-5][0-9] | Recherche une correspondance pour tout nombre à deux chiffres compris entre 00 et 59. |
[a-zA-Z] | Correspond à tous les caractères alphabétiques compris entre a et z, en minuscules OU en majuscules. |
[+] | Dans les ensembles, +, *, ., |, (), $, {} n'ont pas de signification particulière, ils sont conséderés comme des caractères simples. Ainsi, [+] signifie : recherche de tout caractère + dans la chaîne. |
Les fonctions RegEx
Le module re offre un ensemble de fonctions qui nous permettent de rechercher une correspondance dans une chaîne de caractères
Voici la liste des fonction les plus utilisées:
Fonction | Description |
findall | Renvoie une liste contenant toutes les correspondances |
search | Renvoie un objet Match s'il y a une correspondance n'importe où dans la chaîne. |
split | Renvoie une liste dans laquelle la chaîne a été divisée à chaque correspondance. |
sub | Remplace une ou plusieurs correspondances par une chaîne de caractères. |
Examinons les différentes fonctions fournies par le module re pour travailler avec les regex en Python.
La méthode re.findall()
La fonction findall() renvoie une liste contenant toutes les correspondances
La fonction re.findall() renvoie toutes les correspondances non chevauchantes du motif dans la chaîne de caractères, sous la forme d'une liste de chaînes de caractères. La chaîne est parcourue de gauche à droite, et les correspondances sont retournées dans l'ordre trouvé.
Exemple : Recherche de toutes les occurrences d'un motif
Qans cet exemple:
L'utilisation d'un programme Python pour démontrer le fonctionnement de findall()
1. La variable texte contien un exemple de texte où l'expression régulière est recherchée.
2. La variable regex contient un modèle d'expression régulière pour trouver les nombres.
3. La variable match contiendra le résultat retourné.
📋 Copier le code
""" """
import re
texte = "Bonjour, mon adresse est numero 6 rue 16 bloc 25 quartier des bons et celle de mon ami est 98 rue 25 bloc 56 quartier des lions"
regex = "\d+"
match = re.findall(regex, texte)
print(match)
Sortie :
['6', '16', '25', '98', '25', '56']
Une liste vide est renvoyée si aucune correspondance n'est trouvée
La fonction search()
La fonction search() recherche une correspondance dans la chaîne de caractères, et renvoie un objet Match s'il y a une correspondance.
Seule la première occurrence de la correspondance sera renvoyée, si plusieurs correspondances sont trouvées.
La méthode re.search() renvoie soit None (si le motif ne correspond pas), soit un re.MatchObject contenant des informations sur la partie correspondante de la chaîne. Cette méthode s'arrête après la première correspondance, elle est donc plus adaptée pour tester une expression régulière que pour extraire des données.
Exemple : Recherche d'une crrespondance à un modèle
Dans l'exemple suivant nous avons un programme Python pour démontrer le fonctionnement de la méthode search() de regex de python.
1. Utilisons une expression régulière pour faire correspondre une chaîne de date sous la forme du numéro du jour suivi du nom du mois.
La variable regex contient le modèle auquel on va comparer le résultat recherché.
Nous avons " ([0-3][0-9]) ([a-zA-Z]+)" pour chercher:(un espace puis tout nombre à deux chiffres compris entre 00 et 39 puis un espace puis une occurrence de caractère de a à z minuscule ou majuscules) .
Nous stockons le 1er groupe(nombre) dans la variable jour et le 2éme dans la variable mois.
Et dans le block conditionnel if nous ne prenons que les nombres inférieur ou égale à 31.
📋 Copier le code
import re
regex = r" ([0-3][0-9]) ([a-zA-Z]+)"
texte = "Ma date de naissance est le 22 Aout"
resultat = re.search(regex, texte)
jour=(resultat.group(1))
mois=resultat.group(2)
if resultat != None and int(jour)<=31:
print ("Résultat trouvée à l'index %s, %s" % (resultat.start(), resultat.end()))
print ("Résultat complet: %s" % (resultat.group(0)))
print ("Jour: %s" % (jour))
print ("Mois: %s" % (mois))
else:
print ("Aucun résultat n'est trouvé.")
Sortie:
Résultat trouvée à l'index 27, 35
Résultat complet: 22 Aout
Jour: 22
Mois: Aout
La fonction split() de regex en python
La fonction split() renvoie une liste où la chaîne a été divisée à chaque correspondance.
La fonction split() scinde une chaîne de caractères en fonction des occurrences d'un caractère ou d'un motif.
Lorsque ce motif est trouvé, les caractères restants de la chaîne sont renvoyés dans la liste résultante.
Syntaxe de la fonction split():
re.split(modèle, chaîne, maxsplit=0, flags=0)
Le premier paramètre, modèle désigne l'expression régulière.
Le second paramettre chaîne est la chaîne donnée dans laquelle le modèle sera recherché et dans laquelle le fractionnement se produira.
Le troisième paramettre maxsplit si il n'est pas fournie est considérée comme étant zéro '0', et si une valeur non nulle est fournie, alors au plus ce nombre de fractionnements se produira. Si maxsplit = 1, la chaîne ne sera divisée qu'une seule fois, ce qui donnera une liste de longueur 2.
Le paramettre flags est très utile et peut aider à raccourcir le code, ce ne sont pas des paramètres nécessaires.
Par exemple : flags = re.IGNORECASE, dans cette division, la casse, c'est-à-dire la minuscule ou la majuscule, ne sera pas prise en compte.
Dans l’exemple suivant :
Le modèle '\W+' indique des caractères ou un groupe de caractères non alphanumériques
En trouvant ',' , un espace ' ' ou tout caractère non une lettre ou un nombre, la fonction split() divise la chaîne de caractères à partir de ce point
Le modèle '\d+' indique des caractères ou un groupe de caractères numériques
Le fractionnement se produit à '12', '2016', '11' et '02' uniquement
📋 Copier le code
from re import split
texte1 = "Words, words , Words"
texte2 = "Word's words Words"
print(split('\W+', texte1))
print(split('\W+', texte2))
texte3 = "Le 12 janvier 2016, à 11:02 AM"
print(split('\W+', texte3))
print(split('\d+', texte3))
Sortie :
['Words', 'words', 'Words']
['Word', 's', 'words', 'Words']
['Le', '12', 'janvier', '2016', 'à', '11', '02', 'AM']
['Le ', ' janvier ', ', à ', ':', ' AM']
Exemple 2:
Dans l’exemple suivant :
Le fractionnement n'aura lieu qu'une seule fois, à '12', la liste retournée aura une longueur de 2, car nous avons fixé le paramètre maxsplit à 1.
De même Garçon et garçon seront traités de la même façon lorsque flags = re.IGNORECASE
📋 Copier le code
import re
texte1 = "Le 12 Janvier 2016, à 11:02 AM"
texte2 = "He, Un garçon et un garçon, venez ici"
print(re.split('\d+', texte1, 1))
print(re.split('[e-g]+', texte2, flags=re.IGNORECASE))
print(re.split('[e-g]+', texte2))
Sortie :
['Le ', ' Janvier 2016, à 11:02 AM']
['H', ', un ', 'arçon ', 't un ', 'arçon, v', 'n', 'z ici']
['H', ', un Garçon ', 't un ', 'arçon, v', 'n', 'z ici']
La fonction sub() de regex en python
La fonction sub() remplace les correspondances par le texte de votre choix :
Le "sub" de la fonction signifie "SubString".
Un modèle d'expression régulière(1er paramètre) est recherché dans la chaîne de caractères texte (3ème paramètre), et lorsque le modèle de sous-chaîne est trouvé, il est remplacé par remplace (2ème paramètre), le compte(4ème paramètre) contrôle et gère le nombre de fois que cela se produit.
Pour le paramètre flags voir plus haut
Syntaxe de la fonction sub() de regex en python :
re.sub( modèle, remplace, texte, compte=0, flags=0)
Exemple 1 : Programme pour remplacer tous les espaces par des sous tirets "_"
La chaîne de caractères originale est retournée si le motif n'est pas trouvé, re.sub().
📋 Copier le code
import re
# chaîne de caractères multiligne
texte = 'abc de 12 fg \n 34 h57 68 kil'
# correspond à tous les caractères d'espacement
modele = '\s+'
# chaîne de remplacement
remplace = '_'
new_texte = re.sub(modele, remplace, texte)
print(new_texte)
Sortie:
abc_de_12_fg_34_h57_68_kil
La méthode re.sub() peut recevoir count comme quatrième paramètre. S'il est omis, le résultat sera 0, ce qui remplacera toutes les occurrences.
📋 Copier le code
# chaîne de caractères multiligne
texte = 'abc de 12 fg \n 34 h57 68 kil'
# correspond à tous les caractères d'espacement
modele = '\s+'
# chaîne de remplacement
remplace = '_'
# le paramètre compte = 2
# Seules deux occurrence seront remplacées
new_texte = re.sub(modele, remplace, texte, 2)
print(new_texte)
L'objet Match de regex en python
L'objet Match contient toutes les informations sur la recherche et le résultat. Si aucune correspondance n'a été trouvée, l'objet renvoie None. Voici quelques méthodes et attributs couramment utilisés pour l'objet Match.
Récupération de la chaîne et de l'expression régulière
L'attribut re renvoie l'expression régulière passée (match.re)
et l'attribut string renvoie la chaîne passée(match.string), C’est la chaine où la recherche doit être effectuée.
Exemple : Récupérer la chaîne de caractères et l'expression régulière de l'objet matche
Dans cet exemple la variable resultat est l'objet object Match.
📋 Copier le code
import re
texte = "Bienvenue sur le site oujood.com "
resultat = re.search("site", texte)
print(resultat.re)
print(resultat.string)
La sortie :
re.compile('site')
Bienvenue sur le site oujood.com
Récupérer l'index de l'objet correspondant
La méthode start() renvoie l'index de départ de la sous-chaîne correspondante.
La méthode end() renvoie l'index de fin de la sous-chaîne correspondante.
La méthode span() renvoie un tuple contenant l'index de début et l'index de fin de la sous-chaîne correspondante.
Exemple : Obtenir l'index de l'objet correspondant
Ajouter les lignes de code suivantes à l'exemple précédent.
📋 Copier le code
print(resultat.start())
print(resultat.end())
print(resultat.span())
La sortie sera comme suit:
re.compile('site')
Bienvenue sur le site oujood.com
17
21
(17, 21)
Obtenir la sous-chaîne correspondante
La méthode group() renvoie la partie de la chaîne pour laquelle les motifs correspondent. Voir l'exemple ci-dessous pour une meilleure compréhension.
Exemple : Obtenir la sous-chaîne correspondante
Dans cet exemple, le modèle spécifie la chaîne qui contient au moins 6 caractères suivis d'un espace, et cet espace est suivi d'un a.
📋 Copier le code
import re
s = "J'apprends Python avec le site oujood.com "
resultat = re.search(r"\D{6} a", s)
print(resultat.group())
La sortie sera comme suit:
Python a