Python >> Tutoriel Python >  >> Python

Python re.findall() – Tout ce que vous devez savoir

Quand j'ai découvert les expressions régulières pour la première fois, je n'ai pas vraiment apprécié leur pouvoir. Mais il y a une raison pour laquelle les expressions régulières ont survécu à sept décennies de perturbation 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 findall() méthode de Python re bibliothèque. Le findall() est la manière la plus simple d'utiliser les expressions régulières en Python :si vous voulez les maîtriser, commencez ici !

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.findall() travail de méthode ? Étudions la spécification.

Comment fonctionne la méthode findall() en Python ?

Le re.findall(pattern, string) la méthode scanne string de gauche à droite , recherchant toutes les correspondances sans chevauchement des pattern . Il renvoie une liste de chaînes dans l'ordre correspondant lors de la numérisation de la chaîne de gauche à droite.

Spécification :

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

Le re.findall() 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 allons examiner chacun d'eux plus en détail.

Valeur de retour :

Le re.findall() La méthode renvoie une liste de chaînes. Chaque élément de chaîne est une sous-chaîne correspondante de l'argument de chaîne.

Voyons quelques exemples !

Exemples re.findall()

Importez le re module 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 'her' :

>>> re.findall('her', text)
['her', 'her', 'her']

Le premier argument est le modèle que vous recherchez. 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 la variable text - donc vous prenez cela comme le deuxième argument. Vous n'avez pas besoin de définir le troisième argument facultatif flags du findall() car vous êtes d'accord avec le comportement par défaut dans ce cas.

Notez également que le findall() La fonction renvoie une liste de toutes les sous-chaînes correspondantes. Dans ce cas, cela peut ne pas être très utile car nous n'avons recherché qu'une chaîne exacte. Mais si nous recherchons des modèles plus compliqués, cela peut en fait être très utile :

>>> re.findall('\\bf\w+\\b', text)
['frost', 'flower', 'field']

L'expression régulière '\\bf\w+\\b' correspond à tous les mots commençant par le caractère 'f' .

Vous pouvez demander :pourquoi encadrer l'expression régulière avec un '\\b' de début et de fin ? Il s'agit du caractère de limite de mot qui correspond à la chaîne vide au début ou à la fin d'un mot. Vous pouvez définir un mot comme une séquence de caractères qui ne sont pas des caractères d'espacement ou d'autres délimiteurs tels que '.:,?!' .

Dans l'exemple précédent, vous devez échapper le caractère de délimitation '\b' encore une fois car dans une chaîne Python, la signification par défaut de la séquence de caractères '\b' est le caractère barre oblique inverse.

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

Il y a deux différences entre le re.findall(pattern, string) et le re.search(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.findall() et re.match() ?

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

  • re.match(pattern, string) renvoie un objet match tandis que re.findall(pattern, string) renvoie une liste de chaînes correspondantes.
  • re.match(pattern, string) renvoie uniquement la première correspondance dans la chaîne - et uniquement au début - 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.match('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 match() La méthode ne renvoie qu'un objet match de la première occurrence. Le findall() renvoie une liste de toutes les occurrences.