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

Python Regex Fullmatch

Pourquoi les expressions régulières ont-elles survécu à sept décennies de bouleversements technologiques ? Parce que 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 re.fullmatch(pattern, string) méthode de Python re bibliothèque. Il existe trois méthodes similaires pour vous aider à utiliser les expressions régulières :

  • Le re.findall(pattern, string) la méthode renvoie une liste de correspondances de chaînes . Consultez notre tutoriel de blog.
  • Le re.search(pattern, string) la méthode renvoie un objet correspondant du premier match . Consultez notre tutoriel de blog.
  • Le re.match(pattern, string) la méthode renvoie un objet correspondant si l'expression régulière correspond au début de la chaîne . Consultez notre tutoriel de blog.

Article connexe : Python Regex Superpower - Le guide ultime

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

Comment fonctionne re.fullmatch() en Python ?

Le re.fullmatch(pattern, string) La méthode renvoie un objet match si le pattern correspond à l'ensemble string . Un objet de correspondance contient des informations utiles telles que les groupes et les positions correspondants. Un troisième argument facultatif flags permet la personnalisation du moteur regex, par exemple pour ignorer les majuscules.

Spécification :

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

Le re.fullmatch() 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.fullmatch( ) 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 fullmatch() — crée automatiquement un objet de correspondance lors de la première correspondance de motif.


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.


À 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.fullmatch('h...o', 'hello')
>>> m.start()
0
>>> m.end()
5

Dans la première ligne, vous créez un objet match m en utilisant le re.fullmatch() méthode. Le motif 'h...o' correspond dans la chaîne 'hello' à la position de début 0 et à la position de fin 5. Mais notez que comme le fullmatch() la méthode tente toujours de faire correspondre la chaîne entière, le m.start() retournera toujours zéro.

Maintenant, vous connaissez le but de l'objet match en Python. Voyons quelques exemples de re.fullmatch() !

Un exemple guidé pour re.fullmatch()

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

>>> import re
>>> text = '''
Call me Ishmael. Some years ago--never mind how long precisely
--having little or no money in my purse, and nothing particular
to interest me on shore, I thought I would sail about a little
and see the watery part of the world.
'''

Supposons que vous souhaitiez faire correspondre le texte intégral avec cette expression régulière :

>>> re.fullmatch('Call(.|\n)*', text)
>>> 

Le premier argument est le motif à trouver :'Call(.|\n)*' . Le deuxième argument est le texte à analyser. Vous avez stocké la chaîne multiligne dans la variable text - donc vous prenez cela comme le deuxième argument. Le troisième argument flags du fullmatch() est facultative et nous l'ignorons dans le code.

Il n'y a pas de sortie ! Cela signifie que le re.fullmatch() La méthode n'a pas renvoyé d'objet match. Pourquoi? Parce qu'au début de la chaîne, il n'y a pas de correspondance pour le 'Call' partie de la regex. La regex commence par une ligne vide !

Alors, comment pouvons-nous résoudre ce problème ? Simple, en faisant correspondre un caractère de nouvelle ligne '\n' au début de la chaîne.

>>> re.fullmatch('\nCall(.|\n)*', text)
<re.Match object; span=(0, 229), match='\nCall me Ishmael. Some years ago--never mind how>

L'expression régulière (.|\n)* correspond à un nombre arbitraire de caractères (caractères de nouvelle ligne ou non) après le préfixe '\nCall' . Cela correspond à l'ensemble du texte, de sorte que le résultat est un objet de correspondance. Notez qu'il existe 229 positions correspondantes, de sorte que la chaîne incluse dans l'objet match résultant n'est que le préfixe de la chaîne correspondante entière. Ce fait est souvent négligé par les codeurs débutants.

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

Les méthodes re.fullmatch() et re.match(pattern, string) les deux renvoient un objet match. Les deux tentent de correspondre au début de la chaîne. La seule différence est que re.fullmatch() tente également de faire correspondre la fin de la chaîne :il veut faire correspondre la chaîne entière !

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

>>> text = 'More with less'
>>> re.match('More', text)
<re.Match object; span=(0, 4), match='More'>
>>> re.fullmatch('More', text)
>>> 

Le re.match('More', text) la méthode correspond à la chaîne 'More' au début de la chaîne 'More with less' . Mais le re.fullmatch('More', text) méthode ne correspond pas à l'ensemble du texte. Par conséquent, il renvoie le None object—rien n'est imprimé sur votre shell !

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

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

  • re.fullmatch(pattern, string) renvoie un objet match tandis que re.findall(pattern, string) renvoie une liste de chaînes correspondantes.
  • re.fullmatch(pattern, string) ne peut correspondre qu'à la chaîne entière, tandis que re.findall(pattern, string) peut renvoyer plusieurs correspondances dans la chaîne.

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

>>> text = 'the 42th truth is 42'
>>> re.fullmatch('.*?42', text)
<re.Match object; span=(0, 20), match='the 42th truth is 42'>
>>> re.findall('.*?42', text)
['the 42', 'th truth is 42']

Notez que la regex .*? correspond à un nombre arbitraire de caractères mais tente de consommer le moins de caractères possible. C'est ce qu'on appelle la correspondance "non gourmande" (le *? opérateur). Le fullmatch() La méthode ne renvoie qu'un objet match qui correspond à la chaîne entière. Le findall() La méthode renvoie une liste de toutes les occurrences. Comme la correspondance n'est pas gourmande, il trouve deux de ces correspondances.

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

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

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

>>> text = 'Finxter is fun!'
>>> re.search('Finxter', text)
<re.Match object; span=(0, 7), match='Finxter'>
>>> re.fullmatch('Finxter', text)
>>> 

Le re.search() la méthode récupère la correspondance du 'Finxter' sous-chaîne en tant qu'objet de correspondance. Mais le re.fullmatch() la méthode n'a pas de valeur de retour car la sous-chaîne 'Finxter' ne correspond pas à la chaîne entière 'Finxter is fun!' .

Comment utiliser l'argument de drapeau facultatif ?

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

re.fullmatch(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 correspondra 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 la classe de caractères [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 .

Article connexe : Drapeaux Python Regex [Guide ultime]

Vidéo de présentation des méthodes Regex :re.findall() contre re.search() contre re.match() contre re.fullmatch()