Python >> Tutoriel Python >  >> Python Tag >> RegEx

Recherche d'expressions régulières Python

Quand j'ai découvert les expressions régulières pour la première fois, je n'ai pas apprécié leur pouvoir. Mais il y a une raison pour laquelle les expressions régulières ont survécu à sept décennies de bouleversement technologique :les codeurs qui comprennent les expressions régulières ont un énorme avantage lorsqu'ils travaillent avec des données textuelles. Ils peuvent écrire en une seule ligne de code ce qui en prend des dizaines à d'autres !

Cet article concerne le search() méthode de la bibliothèque re de Python. Pour en savoir plus sur le findall() facile à utiliser mais moins puissant méthode qui renvoie une liste de correspondances de chaînes, consultez notre article sur la findall() similaire méthode.

Article connexe : Python Regex Superpower - Le guide ultime

Voulez-vous maîtriser la superpuissance des regex ? Découvrez mon nouveau livre La façon la plus intelligente d'apprendre les expressions régulières en Python avec l'approche innovante en 3 étapes pour un apprentissage actif :(1) étudiez un chapitre de livre, (2) résolvez un puzzle de code et (3) regardez une vidéo de chapitre éducatif.

Alors, comment le re.search() travail de méthode ? Étudions la spécification.

Comment fonctionne re.search() en Python ?

Les re.search(pattern, string) la méthode correspond à la première occurrence du pattern dans le string et renvoie un objet match.

Spécification :

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

Le re.search() la méthode a jusqu'à trois arguments.

  • pattern  :le modèle d'expression régulière que vous souhaitez faire correspondre.
  • string  :la chaîne dans laquelle vous souhaitez rechercher le motif.
  • flags (argument optionnel) :un modificateur plus avancé qui permet de personnaliser le comportement de la fonction. Vous voulez savoir comment utiliser ces drapeaux ? Consultez cet article détaillé sur le blog Finxter.

Nous les explorerons plus en détail plus tard.

Valeur de retour :

Le re.search() La méthode renvoie un objet match. Vous pouvez demander (et à juste titre) :

Qu'est-ce qu'un objet Match ?

Si une expression régulière correspond à une partie de votre chaîne, de nombreuses informations utiles l'accompagnent :quelle est la position exacte de la correspondance ? Quels groupes de regex ont été mis en correspondance et où ?

L'objet match est un simple wrapper pour ces informations. Certaines méthodes regex du package re en Python, telles que search() — crée automatiquement un objet de correspondance lors de la première correspondance de motif.

À ce stade, vous n'avez pas besoin d'explorer l'objet match en détail. Sachez simplement que nous pouvons accéder aux positions de début et de fin de la correspondance dans la chaîne en appelant les méthodes m.start() et m.end() sur l'objet match m :

>>> m = re.search('h...o', 'hello world')
>>> m.start()
0
>>> m.end()
5
>>> 'hello world'[m.start():m.end()]
'hello'

Dans la première ligne, vous créez un objet match m en utilisant le re.search() méthode. Le motif 'h...o' correspond dans la chaîne 'hello world' à la position de début 0. Vous utilisez la position de début et de fin pour accéder à la sous-chaîne qui correspond au modèle (en utilisant la technique Python populaire de découpage).

Maintenant, vous connaissez le but du match() objet en Python. Voyons quelques exemples de re.search() !

Un exemple guidé pour re.search()

Tout d'abord, vous importez le module re et créez la chaîne de texte à rechercher pour les modèles regex :

>>> import re
>>> text = '''
    Ha! let me see her: out, alas! he's cold:
    Her blood is settled, and her joints are stiff;
    Life and these lips have long been separated:
    Death lies on her like an untimely frost
    Upon the sweetest flower of all the field.
'''

Supposons que vous souhaitiez rechercher dans le texte la chaîne "elle" :

>>> re.search('her', text)
<re.Match object; span=(20, 23), match='her'>

Le premier argument est le modèle à trouver. Dans notre cas, c'est la chaîne 'her' . Le deuxième argument est le texte à analyser. Vous avez stocké la chaîne multiligne dans le texte variable, vous le prenez donc comme deuxième argument. Vous n'avez pas besoin de définir le troisième argument facultatif flags du search() car vous êtes d'accord avec le comportement par défaut dans ce cas.

Regardez la sortie :c'est un objet match ! L'objet match donne l'étendue de la correspondance, c'est-à-dire les indices de début et de fin de la correspondance. Nous pouvons également accéder directement à ces limites en utilisant le start() et stop() méthodes de l'objet match :

>>> m = re.search('her', text)
>>> m.start()
20
>>> m.end()
23

Le problème est que le search() La méthode récupère uniquement la première occurrence du modèle dans la chaîne. Si vous voulez trouver toutes les correspondances dans la chaîne, vous pouvez utiliser le findall() méthode de la bibliothèque re.

Quelle est la différence entre re.search() et re.findall() ?

Il y a deux différences entre le re.search(pattern, string) et re.findall(pattern, string) méthodes :

  • re.search(pattern, string) renvoie un objet match tandis que re.findall(pattern, string) renvoie une liste de chaînes correspondantes.
  • re.search(pattern, string) renvoie uniquement la première correspondance dans la chaîne tandis que re.findall(pattern, string) renvoie toutes les correspondances dans la chaîne.

Les deux peuvent être vus dans l'exemple suivant :

>>> text = 'Python is superior to Python'
>>> re.search('Py...n', text)
<re.Match object; span=(0, 6), match='Python'>
>>> re.findall('Py...n', text)
['Python', 'Python']

La chaîne 'Python is superior to Python' contient deux occurrences de 'Python' . Le search() La méthode ne renvoie qu'un objet match de la première occurrence. Le findall() renvoie une liste de toutes les occurrences.

Quelle est la différence entre re.search() et re.match() ?

Les méthodes re.search(pattern, string) et re.match(pattern, string) les deux renvoient un objet match de la première correspondance. Cependant, re.match() tente de faire correspondre le début de la chaîne alors que re.search() correspond n'importe où dans la chaîne.

Vous pouvez voir cette différence dans le code suivant :

>>> text = 'Slim Shady is my name'
>>> re.search('Shady', text)
<re.Match object; span=(5, 10), match='Shady'>
>>> re.match('Shady', text)
>>>

Le re.search() la méthode récupère la correspondance du 'Shady' sous-chaîne en tant qu'objet de correspondance. Mais si vous utilisez le re.match() méthode, il n'y a pas de correspondance ni de valeur de retour car la sous-chaîne 'Shady' n'apparaît pas au début de la chaîne 'Slim Shady is my name' .

Comment utiliser l'argument de drapeau facultatif ?

Comme vous l'avez vu dans la spécification, le search() méthode est livrée avec un troisième 'flag' facultatif argument :

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

A quoi sert l'argument flags ?

Les drapeaux vous permettent de contrôler le moteur d'expressions régulières. Parce que les expressions régulières sont si puissantes, elles sont un moyen utile d'activer et de désactiver certaines fonctionnalités (par exemple, s'il faut ignorer les majuscules lors de la correspondance avec votre regex).

Syntaxe Signification
re.ASCII Si vous n'utilisez pas cet indicateur, les symboles spéciaux Python regex \w, \W, \b, \B, \d, \D, \s et \S correspondront aux caractères Unicode. Si vous utilisez cet indicateur, ces symboles spéciaux ne correspondront qu'aux caractères ASCII, comme leur nom l'indique.
re.A Identique à re.ASCII
re.DEBUG Si vous utilisez cet indicateur, Python affichera des informations utiles sur le shell qui vous aideront à déboguer votre regex.
re.IGNORECASE Si vous utilisez cet indicateur, le moteur regex effectuera une correspondance insensible à la casse. Donc, si vous recherchez [A-Z] , il correspondra également à [a-z] .
re.I Identique à re.IGNORECASE
re.LOCALE N'utilisez jamais ce drapeau. Il est déprécié - l'idée était d'effectuer une correspondance insensible à la casse en fonction de vos paramètres régionaux actuels. Mais ce n'est pas fiable.
re.L Identique à re.LOCALE
re.MULTILINE Cet indicateur active la fonctionnalité suivante :l'expression régulière de début de chaîne '^' correspond au début de chaque ligne (plutôt qu'au début de la chaîne uniquement). Il en va de même pour la regex de fin de chaîne '$' qui correspond désormais également à la fin de chaque ligne dans une chaîne multiligne.
re.M Identique à re.MULTILINE
re.DOTALL Sans utiliser cet indicateur, la regex point '.' correspond à tous les caractères sauf le caractère de saut de ligne '\n' . Activez ce drapeau pour vraiment faire correspondre tous les caractères, y compris le caractère de nouvelle ligne.
re.S Identique à re.DOTALL
re.VERBOSE Pour améliorer la lisibilité des expressions régulières compliquées, vous pouvez autoriser les commentaires et le formatage (multiligne) de la regex elle-même. Ceci est possible avec ce drapeau :tous les caractères d'espacement et les lignes commençant par le caractère '#' sont ignorés dans la regex.
re.X Identique à re.VERBOSE

Voici comment vous l'utiliseriez dans un exemple pratique :

>>> text = 'Python is great!'
>>> re.search('PYTHON', text, flags=re.IGNORECASE)
<re.Match object; span=(0, 6), match='Python'>

Bien que votre regex 'PYTHON' est tout en majuscules, nous ignorons la capitalisation en utilisant le drapeau re.IGNORECASE .

Conclusion

Cet article a introduit le re.search(pattern, string) méthode qui tente de faire correspondre la première occurrence du modèle regex dans une chaîne donnée et renvoie un objet de correspondance.

Python gagne en popularité. Il existe deux types de personnes :celles qui comprennent le codage et celles qui ne le comprennent pas. Ces derniers auront des difficultés de plus en plus grandes à participer à l'ère de l'adoption et de la pénétration massives des contenus numériques. Vous souhaitez augmenter vos compétences Python au quotidien sans investir beaucoup de temps ?

Alors rejoignez ma liste de diffusion "Coffee Break Python" de dizaines de milliers de codeurs ambitieux !


Prochain article