6 votes

Différences entre re.match, re.search, re.fullmatch

De la docs sur les regex il est dit que :

Pattern.match(...)

Si zéro ou plusieurs caractères au début de la chaîne correspondent à cette expression régulière

Pattern.fullmatch(...)

Si la chaîne entière correspond à cette expression régulière

Pattern.search(...)

Parcourir la chaîne de caractères à la recherche du premier endroit où cette expression régulière produit une correspondance.

Compte tenu de ce qui précède, pourquoi quelqu'un ne pourrait-il pas simplement toujours utiliser search pour tout faire ? Par exemple :

re.search(r'...'   # search
re.search(r'^...'  or re.search(r'\A...'   # match
re.search(r'^...$' or re.search(r'\A...\Z' # fullmatch

Sont match y fullmatch juste des raccourcis (si on peut les appeler ainsi) pour les search méthode ? Ou ont-ils d'autres usages que je ne connais pas ?

9voto

ctwheels Points 13464

Donner du crédit pour La réponse de @Ruzihm puisque certaines parties de ma réponse découlent de la sienne.


Aperçu rapide

Un rapide tour d'horizon des différences :

  • re.match est ancré au départ ^pattern
    • S'assure que la chaîne commence par le motif
  • re.fullmatch est ancré au début et à la fin du motif ^pattern$
    • S'assure que la chaîne complète correspond au modèle (peut être particulièrement utile avec les alternances comme décrit aquí )
  • re.search n'est pas ancré pattern
    • S'assure que la chaîne de caractères contient le motif

Une comparaison plus approfondie de re.match vs re.search peuvent être trouvés aquí


Avec des exemples :

aa            # string
a|aa          # regex

re.match:     a
re.search:    a
re.fullmatch: aa

ab            # string
^a            # regex

re.match:     a
re.search:    a
re.fullmatch: # None (no match)

Alors qu'en est-il \A y \Z des ancres ?

En documentation déclare ce qui suit :

Python propose deux opérations primitives différentes basées sur les caractères réguliers. régulières : re.match() ne vérifie qu'une seule correspondance la chaîne, tandis que re.search() vérifie s'il y a une correspondance n'importe où dans le (c'est ce que Perl fait par défaut).

Et dans le Pattern.fullmatch il est dit dans la section :

Si la chaîne entière correspond à cette expression régulière, elle renvoie un objet match correspondant.

Et, comme initialement trouvé et cité par Ruzihm dans sa réponse :

Notez cependant qu'en mode MULTILINE, match() ne correspond qu'à l'élément début de la chaîne, alors qu'en utilisant search() avec une expression régulière régulière commençant par ^ correspondra au début de chaque ligne.

>>> re.match('X', 'A\nB\nX', re.MULTILINE)  # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE)  # Match
<re.Match object; span=(4, 5), match='X'>
\A^A
B
X$\Z

# re.match('X', s)                  no match
# re.search('^X', s)                no match

# ------------------------------------------
# and the string above when re.MULTILINE is enabled effectively becomes

\A^A$
^B$
^C$\Z

# re.match('X', s, re.MULTILINE)    no match
# re.search('^X', s, re.MULTILINE)  match X

En ce qui concerne \A y \Z les performances ne sont pas différentes pour re.MULTILINE depuis \A y \Z sont effectivement les seuls ^ y $ dans toute la chaîne.

Donc, en utilisant \A y \Z avec l'une des trois méthodes donne les mêmes résultats.


Réponse (ancres de ligne vs ancres de chaîne)

Ce que cela me dit, c'est que re.match y re.fullmatch ne correspondent pas ancres de ligne ^ y $ respectivement, mais qu'ils correspondent plutôt à ancres de chaîne \A y \Z respectivement.

3voto

Ruzihm Points 7430

Oui, ils peuvent être considérés comme des raccourcis de re.search les appels qui commencent par \A ou commencer par \A et se terminent par \Z .

Parce que \A spécifie toujours le début de la chaîne, en utilisant re.search et en faisant précéder \A semble assimiler re.match même en mode MULTILINE. Quelques exemples :

import re
haystack = "A\nB\nZ"

matchstring = 'A'
x=re.match(matchstring, haystack) # Match
y=re.search('\A' + matchstring, haystack) # Match

matchstring = 'A$\nB'
x=re.match(matchstring, haystack, re.MULTILINE) # Match
y=re.search('\A' + matchstring, haystack, re.MULTILINE) # Match

matchstring = 'A\n$B'
x=re.match(matchstring, haystack, re.MULTILINE) # No match
y=re.search('\A' + matchstring, haystack, re.MULTILINE) # No match

Il en va de même si l'on place la chaîne de recherche entre les éléments suivants \A y \Z d'égaler fullmatch .


Non compris \A / \Z :

Non, ils traitent MULTILINE différemment. De la documentation :

Notez cependant qu'en mode MULTILINE match() o au début de la chaîne, alors que l'utilisation de search() w commençant par '^' correspondra au début ligne.

...

>>> re.match('X', 'A\nB\nX', re.MULTILINE)  # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE)  # Match
<re.Match object; span=(4, 5), match='X'>

De même, en mode MULTILINE, fullmatch() correspond au début et à la fin de la chaîne de caractères, et search() con '^...$' correspond au début et à la fin de chaque ligne.


Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X