Comprendre les fonctions Python Regex, avec des exemples

Les expressions régulières (regex) sont des séquences spéciales de caractères utilisées pour rechercher ou faire correspondre des modèles dans des chaînes, comme l’explique cette introduction aux regex. Nous avons déjà montré comment utiliser des expressions régulières avec JavaScript et PHP. L’objectif de cet article est Python regex, dans le but de vous aider à mieux comprendre comment manipuler les expressions régulières en Python.

Vous apprendrez à utiliser efficacement les fonctions et les méthodes Python regex dans vos programmes, car nous couvrons les nuances impliquées dans la gestion des objets Python regex.

Modules d’expressions régulières en Python : re et regex

Python a deux modules — re et regex — qui facilitent le travail avec les expressions régulières. La re module est intégré à Python, tandis que le regex Le module a été développé par Matthew Barnett et est disponible sur PyPI. La regex module par Barnett est développé en utilisant le re module, et les deux modules ont des fonctionnalités similaires. Ils diffèrent en termes de mise en œuvre. L’intégré re module est le plus populaire des deux, nous allons donc travailler avec ce module ici.

Module re intégré de Python

Le plus souvent, les développeurs Python utilisent le re module lors de l’exécution d’expressions régulières. La construction générale de la syntaxe des expressions régulières reste la même (caractères et symboles), mais le module fournit certaines fonctions et méthodes pour exécuter efficacement regex dans un programme Python.

Avant de pouvoir utiliser le re module, nous devons l’importer dans notre fichier comme n’importe quel autre module ou bibliothèque Python :

import re

Cela rend le module disponible dans le fichier actuel afin que les fonctions et méthodes regex de Python soient facilement accessibles. Avec le re module, nous pouvons créer des objets regex Python, manipuler des objets correspondants et appliquer des drapeaux si nécessaire.

Une sélection de fonctions re.

La re module a des fonctions telles que re.search(), re.match()et re.compile()dont nous parlerons en premier.

re.search(motif, chaîne, drapeaux=0) vs re.match(motif, chaîne, drapeaux=0)

La re.search() et re.match() rechercher dans une chaîne un modèle de regex Python et renvoyer une correspondance si elle est trouvée ou None si aucun objet correspondant n’est trouvé.

Les deux fonctions renvoient toujours la première sous-chaîne correspondante trouvée dans une chaîne donnée et conservent une valeur par défaut 0 pour drapeau. Mais alors que le search() la fonction parcourt une chaîne entière pour trouver une correspondance, match() recherche uniquement une correspondance au début d’une chaîne.

Python re.search() Documentation:

Numérisation chaîne de caractères à la recherche du premier emplacement où l’expression régulière motif produit une correspondance et renvoie un objet de correspondance correspondant. Revenir None si aucune position dans la chaîne ne correspond au motif ; notez que cela est différent de la recherche d’une correspondance de longueur nulle à un moment donné de la chaîne.

Python re.match() Documentation:

Si zéro ou plusieurs caractères au début de chaîne de caractères correspondre à l’expression régulière motif, renvoie un objet correspondant correspondant. Revenir None si la chaîne ne correspond pas au modèle ; notez que cela est différent d’une correspondance de longueur nulle.

Voyons quelques exemples de code pour clarifier davantage :

search_result = [re.search](http://re.search)(r'd{2}', 'I live at 22 Garden Road, East Legon')

print(search_result)

print(search_result.group())

>>>>

<re.Match object; span=(10, 12), match='22'>

22
match_result = re.match(r'd{2}', 'I live at 22 Garden Road, East Legon')

print(match_result)

print(match_result.group())

>>>>

None

Traceback (most recent call last):

File "/home/ini/Dev./sitepoint/regex.py", line 4, in <module>

print(match_result.group())

AttributeError: 'NoneType' object has no attribute 'group'

A partir de l’exemple ci-dessus, None Il a été renvoyé car il n’y avait pas de match au début de la série. Un AttributeError a été soulevé lorsque le group() méthode a été appelée, car il n’y a pas d’objet correspondant :

match_result = re.match(r'd{2}', "45 cars were used for the president's convoy")

print(match_result)

print(match_result.group())

>>>>

<re.Match object; span=(0, 2), match='45'>

45

Avec 45, l’objet match au début de la chaîne, le match() méthode fonctionne très bien.

re.compile(motif, flags=0)

La compile() La fonction prend un modèle d’expression régulière donné et le compile dans un objet d’expression régulière utilisé pour trouver une correspondance dans une chaîne ou un texte. Il accepte également une flag comme deuxième argument facultatif. Cette méthode est utile car l’objet regex peut être affecté à une variable et utilisé ultérieurement dans notre code Python. Rappelez-vous toujours d’utiliser une chaîne brute r"..." lors de la création d’un objet regex Python.

Voici un exemple de la façon dont cela fonctionne :

regex_object = re.compile(r'b[ae]t')

mo = regex_object.search('I bet, you would not let a bat be your president')

print(regex_object)

>>>>

re.compile('b[ae]t')

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

Cette fonction prend deux arguments : une chaîne transmise en tant que modèle d’expression régulière, une chaîne à rechercher et un argument d’indicateur facultatif. Un objet match est renvoyé si la chaîne entière correspond au modèle regex donné. S’il n’y a pas de correspondance, il revient None:

regex_object = re.compile(r'Tech is the future')

mo = regex_object.fullmatch('Tech is the future, join now')

print(mo)

print([mo.group](http://mo.group)())

>>>>

None

Traceback (most recent call last):

File "/home/ini/Dev./sitepoint/regex.py", line 16, in <module>

print([mo.group](http://mo.group)())

AttributeError: 'NoneType' object has no attribute 'group'

Le code soulève un AttributeErrorcar aucune chaîne ne correspond.

re.findall (motif, chaîne, drapeaux = 0)

La findall() La fonction renvoie une liste de tous les objets correspondants trouvés dans une chaîne donnée. Il parcourt la chaîne de gauche à droite, jusqu’à ce que toutes les correspondances soient renvoyées. Voir l’extrait de code ci-dessous :

regex_object = re.compile(r'[A-Z]w+')

mo = regex_object.findall('Pick out all the Words that Begin with a Capital letter')

print(mo)

>>>>

['Pick', 'Words', 'Begin', 'Capital']

Dans l’extrait de code ci-dessus, l’expression régulière se compose d’une classe de caractères et d’un caractère de mot, ce qui garantit que la sous-chaîne correspondante commence par une lettre majuscule.

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

Des parties d’une chaîne peuvent être remplacées par une autre sous-chaîne à l’aide de la sub() fonction. Il prend au moins trois arguments : le modèle de recherche, la chaîne de remplacement et la chaîne sur laquelle travailler. La chaîne d’origine est renvoyée inchangée si aucune correspondance n’est trouvée. Sans passer d’argument count, par défaut, la fonction trouve une ou plusieurs occurrences de l’expression régulière et remplace toutes les correspondances.

Voici un exemple :

regex_object = re.compile(r'disagreed')

mo = regex_object.sub('agreed',"The founder and the CEO disagreed on the company's new direction, the investors disagreed too.")

print(mo)

>>>>

The founder and the CEO agreed on the company's new direction, the investors agreed too.

subn(pattern, repl, string, count=0, flags=0)

La subn() fonction effectue la même opération que sub(), mais il renvoie un tuple avec la chaîne et le nombre de remplacements effectués. Voir l’extrait de code ci-dessous :

regex_object = re.compile(r'disagreed')

mo = regex_object.subn('agreed',"The founder and the CEO disagreed on the company's new direction, the investors disagreed too.")

print(mo)

>>>>

("The founder and the CEO agreed on the company's new direction, the investors agreed too.", 2)

Faire correspondre les objets et les méthodes

UN objet de correspondance est renvoyé lorsqu’un motif regex correspond à une chaîne donnée dans l’objet regex search() ou match() méthode. Les objets match ont plusieurs méthodes qui s’avèrent utiles lors de la manipulation de regex en Python.

Match. groupe([group1, …])

Cette méthode renvoie un ou plusieurs sous-groupes d’un objet correspondant. Un seul argument renverra un sous-groupe de signaux ; Plusieurs arguments renverront plusieurs sous-groupes, en fonction de leurs index. Par défaut, le group() La méthode renvoie la totalité de la sous-chaîne correspondante. Lorsque l’argument dans le group() est supérieur ou inférieur aux sous-groupes, un IndexError exception est levée.

Voici un exemple :

regex_object = re.compile(r'(+d{3}) (d{2} d{3} d{4})')

mo = regex_object.search('Pick out the country code from the phone number: +233 54 502 9074')

print([mo.group](http://mo.group)(1))

>>>>

+233

L’argument 1 passé dans le group(1) méthode – comme dans l’exemple ci-dessus – sélectionne le code du pays pour le Ghana +233. Appel de la méthode sans argument ou 0 renvoie en argument tous les sous-groupes de l’objet correspondant :

regex_object = re.compile(r'(+d{3}) (d{2} d{3} d{4})')

mo = regex_object.search('Pick out the phone number: +233 54 502 9074')

print([mo.group](http://mo.group)())

>>>>

+233 54 502 9074

Match.groups(par défaut=Aucun)

groups() renvoie un tuple de sous-groupes qui correspondent à la chaîne donnée. Les groupes de modèles Regex sont toujours capturés avec des parenthèses — () — et ces groupes sont renvoyés lorsqu’il y a une correspondance, en tant qu’éléments dans un tuple :

regex_object = re.compile(r'(+d{3}) (d{2}) (d{3}) (d{4})')

mo = regex_object.search('Pick out the phone number: +233 54 502 9074')

print(mo.groups())

>>>>

('+233', '54', '502', '9074')

Match. start([group]) & Match.end([group])

La start() renvoie l’index de départ, tandis que la méthode end() renvoie l’index de fin de l’objet match :

regex_object = re.compile(r'sw+')

mo = regex_object.search('Match any word after a space')

print('Match begins at', mo.start(), 'and ends', mo.end())

print([mo.group](http://mo.group)())

>>>>

Match begins at 5 and ends 9

any

L’exemple ci-dessus a un modèle regex pour faire correspondre n’importe quel caractère de mot après un espace. Une correspondance a été trouvée — ' any' — à partir de la position 5 et se terminant à 9.

Motif.recherche(chaîne[, pos[, endpos]])

La pos La valeur indique la position d’index où la recherche d’un objet correspondant doit commencer. endpos indique où la recherche d’une correspondance doit s’arrêter. La valeur pour les deux pos et endpos peuvent être passés comme arguments dans le search() ou match() méthodes après la chaîne. Voilà comment cela fonctionne:

regex_object = re.compile(r'[a-z]+[0-9]')

mo = regex_object.search('find the alphanumeric character python3 in the string', 20 , 30)

print([mo.group](http://mo.group)())

>>>>

python3

Le code ci-dessus sélectionne n’importe quel caractère alphanumérique dans la chaîne de recherche.

La recherche commence à la position d’index de chaîne de 20 et s’arrête à 30.

concernant les drapeaux Regex

Python permet l’utilisation de drapeaux lors de l’utilisation re méthodes de module comme search() et match(), ce qui donne plus de contexte aux expressions régulières. Les drapeaux sont des arguments facultatifs qui spécifient comment le moteur Python regex trouve un objet correspondant.

re.I (re.IGNORECASE)

Cet indicateur est utilisé lors de l’exécution d’une correspondance insensible à la casse. Le moteur regex ignorera les variations majuscules ou minuscules des modèles d’expressions régulières :

regex_object = [re.search](http://re.search)('django', 'My tech stack comprises of python, Django, MySQL, AWS, React', re.I)

print(regex_object.group())

>>>>

Django

La re.I Il garantit qu’un objet correspondant est trouvé, qu’il soit en majuscules ou en minuscules.

re.S (re.DOTALL)

La '.' caractère spécial correspond à n’importe quel caractère sauf un saut de ligne. L’introduction de cet indicateur correspondra également à une nouvelle ligne dans un bloc de texte ou une chaîne. Voir l’exemple ci-dessous :

regex_object= [re.search](http://re.search)('.+', 'What is your favourite coffee flavor nI prefer the Mocha')

print(regex_object.group())

>>>>

What is your favourite coffee flavor

La '.' Le caractère ne trouve une correspondance qu’à partir du début de la chaîne et s’arrête à la nouvelle ligne. Présentation de la re.DOTALL flag correspondra à un nouveau caractère de ligne. Voir l’exemple ci-dessous :

regex_object= [re.search](http://re.search)('.+', 'What is your favourite coffee flavor nI prefer the Mocha', re.S)

print(regex_object.group())

>>>>

What is your favourite coffee flavor

I prefer the Mocha

re.M (re.MULTILINE)

Par défaut le '^' caractère spécial ne correspond qu’au début d’une chaîne. Avec cet indicateur introduit, la fonction recherche une correspondance au début de chaque ligne. La '$' le caractère ne correspond qu’aux modèles à la fin de la chaîne. Mais le re.M flag garantit qu’il trouve également des correspondances à la fin de chaque ligne :

regex_object = [re.search](http://re.search)('^Jw+', 'Popular programming languages in 2022: nPython nJavaScript nJava nRust nRuby', re.M)

print(regex_object.group())

>>>>

JavaScript

re.X (re.VERBOSE)

Parfois, les modèles de regex Python peuvent devenir longs et désordonnés. La re.X flag aide lorsque nous devons ajouter des commentaires dans notre modèle regex. Nous pouvons utiliser le ''' format de chaîne pour créer une expression régulière multiligne avec des commentaires :

email_regex = [re.search](http://re.search)(r'''

[a-zA-Z0-9._%+-]+ # username composed of alphanumeric characters

@ # @ symbol

[a-zA-Z0-9.-]+ # domain name has word characters

(.[a-zA-Z]{2,4}) # dot-something

''', 'extract the email address in this string [kwekujohnson1@gmail.com](mailto:kwekujohnson1@gmail.com) and send an email', re.X)

print(email_regex.group())

>>>>

[kwekujohnson1@gmail.com](mailto:kwekujohnson1@gmail.com)

Exemples pratiques de Regex en Python

Passons maintenant à quelques exemples plus pratiques.

Expression régulière de test de force de mot de passe Python

L’un des cas d’utilisation les plus populaires pour les expressions régulières consiste à tester la force du mot de passe. Lors de la création d’un nouveau compte, une vérification est effectuée pour s’assurer que nous saisissons une combinaison appropriée de lettres, de chiffres et de caractères pour garantir un mot de passe fort.

Voici un exemple de modèle regex pour vérifier la force du mot de passe :

password_regex = re.match(r"""

^(?=.*?[A-Z]) # this ensures user inputs at least one uppercase letter

(?=.*?[a-z]) # this ensures user inputs at least one lowercase letter

(?=.*?[0-9]) # this ensures user inputs at least one digit

(?=.*?[#?!@$%^&*-]) # this ensures user inputs one special character

.{8,}$ #this ensures that password is at least 8 characters long

""", '@Sit3po1nt', re.X)

print('Your password is' ,password_regex.group())

>>>>

Your password is @Sit3po1nt

Notez l’utilisation de '^' et '$' pour vous assurer que la chaîne d’entrée (mot de passe) est une correspondance d’expression régulière.

Python recherche et remplace dans le fichier regex

Voici notre objectif pour cet exemple :

  • Créez un fichier ‘pangram.txt’.
  • Ajoutez un simple texte au fichier, "The five boxing wizards climb quickly."
  • Écrivez une simple regex Python pour rechercher et remplacer “grimper” par “sauter” afin que nous ayons un pangramme.

Voici un code pour le faire :



import re

file_path="pangram.txt"

text="climb"

subs="jump"



def search_and_replace(filePath, text, subs, flags=0):

with open(file_path, "r+") as file:



file_contents = [file.read](http://file.read)()

text_pattern = re.compile(re.escape(text), flags)

file_contents = text_pattern.sub(subs, file_contents)

[file.seek](http://file.seek)(0)

file.truncate()

file.write(file_contents)



search_and_replace(file_path, text, subs)

Expression régulière de grattage Web Python

Parfois, vous devrez peut-être récolter des données sur Internet ou automatiser des tâches simples comme le grattage Web. Les expressions régulières sont très utiles lors de l’extraction de certaines données en ligne. Ci-dessous un exemple :

import urllib.request

phone_number_regex = r'(d{3}) d{3}-d{4}'

url = 'https://www.summet.com/dmsi/html/codesamples/addresses.html'



response = urllib.request.urlopen(url)



string_object = [response.read](http://response.read)().decode("utf8")



regex_object = re.compile(phone_regex)

mo = regex_object.findall(string_object)



print(mo[: 5])

>>>>

['(257) 563-7401', '(372) 587-2335', '(786) 713-8616', '(793) 151-6230', '(492) 709-6392']

Conclusion

Les expressions régulières peuvent varier de simples à complexes. Ils sont une partie essentielle de la programmation, comme le montrent les exemples ci-dessus. Pour mieux comprendre les expressions régulières en Python, il est bon de commencer par se familiariser avec des éléments tels que les classes de caractères, les caractères spéciaux, les ancres et les constructions de regroupement.

Nous pouvons aller beaucoup plus loin pour approfondir notre compréhension des regex en Python. Le Python re permet de se lever et de courir rapidement.

Regex réduit considérablement la quantité de code que nous devons écrire pour faire des choses comme valider l’entrée et implémenter des algorithmes de recherche.

Il est également bon de pouvoir répondre aux questions sur l’utilisation des expressions régulières, car elles reviennent souvent dans les entretiens techniques avec les ingénieurs et les développeurs de logiciels.

Leave a Comment

Your email address will not be published. Required fields are marked *