Python >> Tutoriel Python >  >> Python

Python Re Point

Vous êtes sur le point d'apprendre l'un des opérateurs regex les plus fréquemment utilisés :la regex point . dans la bibliothèque re de Python.

Vous pouvez également regarder la vidéo de présentation pendant que vous lisez le didacticiel :

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.

Qu'est-ce que Dot Regex dans la bibliothèque Re de Python ?

Le point regex . correspond à tous les caractères sauf le caractère de saut de ligne. Par exemple, l'expression régulière '...' correspond aux chaînes 'hey' et 'tom' . Mais cela ne correspond pas à la chaîne 'yo\nto' qui contient le caractère de saut de ligne '\n' . Combiné avec le quantificateur astérisque dans le modèle '.*' , l'expression régulière point correspond à un nombre arbitraire de symboles, à l'exception des caractères de saut de ligne.

Exercice :Devinez la sortie de cet extrait de code. Exécutez le code pour vérifier si vous aviez raison ! Maintenant, essayez de faire correspondre un autre mot en utilisant l'expression régulière point.

Exemples Point Regex

Étudions quelques exemples de base pour mieux comprendre.

>>> import re
>>> 
>>> text = '''But then I saw no harm, and then I heard
Each syllable that breath made up between them.'''
>>> re.findall('B..', text)
['But']
>>> re.findall('heard.Each', text)
[]
>>> re.findall('heard\nEach', text)
['heard\nEach']
>>> 

Vous importez d'abord la bibliothèque re de Python pour la gestion des expressions régulières. Ensuite, vous créez un texte multiligne en utilisant les guillemets triples.

Plongeons-nous dans le premier exemple :

>>> re.findall('B..', text)
['But']

Vous utilisez le re.findall() méthode. Voici la définition tirée de l'article du blog Finxter :

Le re.findall(pattern, string) la méthode trouve toutes les occurrences du pattern dans le string et renvoie une liste de toutes les sous-chaînes correspondantes.

Veuillez consulter l'article du blog pour apprendre tout ce que vous devez savoir sur cette méthode Python fondamentale.

Le premier argument est le modèle d'expression régulière 'B..' . Le deuxième argument est la chaîne à rechercher pour le modèle. Vous voulez trouver tous les modèles commençant par le 'B' caractère, suivi de deux caractères arbitraires à l'exception du caractère de nouvelle ligne.

Le findall() la méthode ne trouve qu'une seule occurrence :la chaîne 'But' .

Le deuxième exemple montre que l'opérateur point ne correspond pas au caractère de saut de ligne :

>>> re.findall('heard.Each', text)
[]

Dans cet exemple, vous regardez le modèle simple 'heard.Each' . Vous voulez trouver toutes les occurrences de la chaîne 'heard' suivi d'un caractère arbitraire non blanc, suivi de la chaîne 'Each' .

Mais un tel modèle n'existe pas ! De nombreux codeurs lisent intuitivement la regex point comme un caractère arbitraire . Vous devez être conscient que la définition correcte de la regex point est un caractère arbitraire à l'exception de la nouvelle ligne . C'est une source de nombreux bugs dans les expressions régulières.

Le troisième exemple vous montre comment faire correspondre explicitement le caractère de nouvelle ligne '\n' à la place :

>>> re.findall('heard\nEach', text)
['heard\nEach']

Maintenant, le moteur regex correspond à la sous-chaîne.

Naturellement, la question pertinente suivante se pose :

Comment faire correspondre un caractère arbitraire (y compris la nouvelle ligne) ?

Le point regex . correspond à un seul caractère arbitraire, à l'exception du caractère de saut de ligne. Mais que se passe-t-il si vous voulez également faire correspondre le caractère de nouvelle ligne ? Il existe deux façons principales d'y parvenir.

  • Utilisez le re.DOTALL drapeau.
  • Utiliser une classe de caractères [.\n] .

Voici l'exemple concret montrant les deux cas :

>>> import re
>>> 
>>> s = '''hello
python'''
>>> re.findall('o.p', s)
[]
>>> re.findall('o.p', s, flags=re.DOTALL)
['o\np']
>>> re.findall('o[.\n]p', s)
['o\np']

Vous créez une chaîne multiligne. Ensuite, vous essayez de trouver le modèle regex 'o.p' dans la chaîne. Mais il n'y a pas de correspondance car l'opérateur point ne correspond pas au caractère de nouvelle ligne par défaut. Cependant, si vous définissez le drapeau re.DOTALL , le caractère de saut de ligne sera également une correspondance valide.

En savoir plus sur les différents drapeaux dans le didacticiel de mon blog Finxter.

Une alternative consiste à utiliser le modèle regex légèrement plus compliqué [.\n] . Les crochets entourent une classe de caractères — un ensemble de caractères qui sont tous une correspondance valide. Considérez une classe de caractères comme une opération OU :exactement un caractère doit correspondre.

Comment faire correspondre le caractère point (sans signification particulière) ?

Si vous utilisez le caractère '.' dans une expression régulière, Python suppose que c'est l'opérateur point dont vous parlez. Mais que se passe-t-il si vous voulez réellement faire correspondre un point, par exemple pour faire correspondre le point à la fin d'une phrase ?

Rien de plus simple que cela :échappez la regex point en utilisant la barre oblique inverse :'\.' . La barre oblique inverse annule la signification du symbole spécial '.' dans la regex. Le moteur regex sait maintenant que vous recherchez en fait le caractère point, et non un caractère arbitraire, à l'exception d'une nouvelle ligne.

Voici un exemple :

>>> import re
>>> text = 'Python. Is. Great. Period.'
>>> re.findall('\.', text)
['.', '.', '.', '.']

Le findall() La méthode renvoie les quatre périodes de la phrase en tant que sous-chaînes correspondantes pour la regex '\.' .

Dans cet exemple, vous apprendrez comment le combiner avec d'autres expressions régulières :

>>> re.findall('\.\s', text)
['. ', '. ', '. ']

Maintenant, vous recherchez un caractère point suivi d'un espace blanc arbitraire. Il n'y a que trois sous-chaînes correspondantes dans le texte.

Dans l'exemple suivant, vous apprendrez à combiner ceci avec une classe de caractères :

>>> re.findall('[st]\.', text)
['s.', 't.']

Vous voulez trouver l'un ou l'autre des caractères 's' ou caractère 't' suivi du caractère point '.' . Deux sous-chaînes correspondent à cette expression régulière.

Notez qu'il est nécessaire d'ignorer la barre oblique inverse. Si vous l'oubliez, cela peut entraîner un comportement étrange :

>>> re.findall('[st].', text)
['th', 's.', 't.']

Comme un caractère arbitraire est autorisé après la classe de caractères, la sous-chaîne 'th' correspond également à la regex.

[Collection] Quels sont les différents quantificateurs Python Re ?

Si vous voulez utiliser (et comprendre) les expressions régulières dans la pratique, vous devez connaître les quantificateurs les plus importants qui peuvent être appliqués à n'importe quelle regex (y compris la regex point) !

Plongeons-nous donc dans les autres expressions régulières :

Quantificateur Description Exemple
. Le caractère générique ('point') correspond à n'importe quel caractère d'une chaîne à l'exception du caractère de saut de ligne '\n' . Regex '...' correspond à tous les mots de trois caractères tels que 'abc' , 'cat' , et 'dog' .
* Le zéro ou plus l'astérisque correspond à un nombre arbitraire d'occurrences (y compris zéro occurrence) de l'expression régulière précédente. Regex 'cat*' correspond aux chaînes 'ca' , 'cat' , 'catt' , 'cattt' , et 'catttttttt' . —
? Le zéro ou un correspond (comme son nom l'indique) à zéro ou à une occurrence de la regex immédiatement précédente. Regex 'cat?' correspond aux deux chaînes 'ca' et 'cat' — mais pas 'catt' , 'cattt' , et 'catttttttt' .
+ Le au moins un correspond à une ou plusieurs occurrences de la regex immédiatement précédente. Regex 'cat+' ne correspond pas à la chaîne 'ca' mais correspond à toutes les chaînes avec au moins un caractère de fin 't' comme 'cat' , 'catt' , et 'cattt' .
^ Le début de chaîne correspond au début d'une chaîne. Regex '^p' correspond aux chaînes 'python' et 'programming' mais pas 'lisp' et 'spying' où le caractère 'p' ne se produit pas au début de la chaîne.
$ La fin -de-chaîne correspond à la fin d'une chaîne. Regex 'py$' correspondrait aux chaînes ' main.py' et ' pypy' mais pas les chaînes 'python' et 'pypi' .
A|B Le OU correspond à la regex A ou à la regex B. Notez que l'intuition est assez différente de l'interprétation standard de l'opérateur or qui peut également satisfaire les deux conditions. Regex ' (bonjour)|(salut)' correspond aux chaînes 'hello world' et 'hi python' . Cela n'aurait aucun sens d'essayer de faire correspondre les deux en même temps.
AB  Le ET correspond d'abord à la regex A et ensuite à la regex B, dans cette séquence. On l'a déjà vu trivialement dans la regex 'ca' qui correspond à la première expression régulière 'c' et deuxième regex 'a' .

Notez que j'ai donné aux opérateurs ci-dessus des noms plus significatifs (en gras) afin que vous puissiez saisir immédiatement le but de chaque regex. Par exemple, le ‘^’ L'opérateur est généralement désigné par l'opérateur "caret". Ces noms ne sont pas descriptifs, j'ai donc trouvé des mots plus proches de la maternelle, tels que l'opérateur "début de chaîne".

Nous avons déjà vu de nombreux exemples, mais plongeons-nous encore plus !

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.
'''

print(re.findall('.a!', text))
'''
Finds all occurrences of an arbitrary character that is
followed by the character sequence 'a!'.
['Ha!']
'''

print(re.findall('is.*and', text))
'''
Finds all occurrences of the word 'is',
followed by an arbitrary number of characters
and the word 'and'.
['is settled, and']
'''

print(re.findall('her:?', text))
'''
Finds all occurrences of the word 'her',
followed by zero or one occurrences of the colon ':'.
['her:', 'her', 'her']
'''

print(re.findall('her:+', text))
'''
Finds all occurrences of the word 'her',
followed by one or more occurrences of the colon ':'.
['her:']
'''


print(re.findall('^Ha.*', text))
'''
Finds all occurrences where the string starts with
the character sequence 'Ha', followed by an arbitrary
number of characters except for the new-line character. 
Can you figure out why Python doesn't find any?
[]
'''

print(re.findall('n$', text))
'''
Finds all occurrences where the new-line character 'n'
occurs at the end of the string.
['n']
'''

print(re.findall('(Life|Death)', text))
'''
Finds all occurrences of either the word 'Life' or the
word 'Death'.
['Life', 'Death']
'''

Dans ces exemples, vous avez déjà vu le symbole spécial ‘\n’ qui désigne le caractère de nouvelle ligne en Python (et la plupart des autres langages). Il existe de nombreux caractères spéciaux, spécialement conçus pour les expressions régulières.

Méthodes Re associées

Il existe cinq méthodes d'expression régulière importantes que vous devez maîtriser :

  • Le re.findall(pattern, string) La méthode renvoie une liste de correspondances de chaînes. Pour en savoir plus, consultez le didacticiel de notre blog.
  • Le re.search(pattern, string) La méthode renvoie un objet match de la première correspondance. Pour en savoir plus, consultez le didacticiel de notre blog.
  • Le re.match(pattern, string) La méthode renvoie un objet match si l'expression régulière correspond au début de la chaîne. Pour en savoir plus, consultez le didacticiel de notre blog.
  • Le re.fullmatch(pattern, string) La méthode renvoie un objet match si l'expression régulière correspond à la chaîne entière. Pour en savoir plus, consultez le didacticiel de notre blog.
  • Le re.compile(pattern) La méthode prépare le modèle d'expression régulière et renvoie un objet regex que vous pouvez utiliser plusieurs fois dans votre code. Pour en savoir plus, consultez le didacticiel de notre blog.
  • Le re.split(pattern, string) La méthode renvoie une liste de chaînes en faisant correspondre toutes les occurrences du modèle dans la chaîne et en divisant la chaîne le long de celles-ci. Pour en savoir plus, consultez le didacticiel de notre blog.
  • Le re.sub(pattern, repl, string, count=0, flags=0) La méthode renvoie une nouvelle chaîne où toutes les occurrences du modèle dans l'ancienne chaîne sont remplacées par repl . Pour en savoir plus, consultez le didacticiel de notre blog.

Ces sept méthodes représentent 80 % de ce que vous devez savoir pour démarrer avec la fonctionnalité d'expression régulière de Python.