Python

Expressions régulières utilisant Python 3

Expressions régulières utilisant Python 3
Les expressions régulières sont souvent considérées comme cette série vraiment obscure de hiéroglyphes que l'on copie généralement à partir d'Internet et que l'on colle dans son code. Ce sortilège mystérieux montre alors des capacités magiques de trouver des motifs à l'intérieur de chaînes de texte et si nous le demandons gentiment, il nous fera même la faveur de remplacer un motif donné dans une chaîne par quelque chose de plus agréable.

Par exemple, lorsque vous écrivez des gestionnaires pour l'URL (et que Dieu vous aide si vous en écrivez un à partir de zéro), vous souhaitez souvent afficher le même résultat quel que soit le '/' de fin dans l'URL. E.g https://exemple.com/user/settings/ et https://exemple.com/user/settings doivent tous les deux pointer vers la même page malgré le '/' de fin. 

Cependant, vous ne pouvez pas ignorer toutes les barres obliques, comme :

  1. La barre oblique entre 'user' et 'settings', e, 'user/settings'.
  2. Aussi vous devrez prendre en compte le '//' au début de votre FQDN suivi de 'https'.

Donc, vous venez avec une règle comme : « Ignorez uniquement les barres obliques suivies d'un espace vide." et si vous le souhaitez, vous pouvez encoder cette règle avec une série d'instructions if-else. Mais ça va vite devenir encombrant. Vous pouvez écrire une fonction disant cleanUrl() qui peut l'encapsuler pour vous. Mais l'univers va bientôt commencer à vous lancer plus de balles courbes. Vous vous retrouverez bientôt à écrire des fonctions pour cleanHeaders(), processLog(), etc. Ou vous pouvez utiliser une expression régulière chaque fois qu'un type de correspondance de modèle est requis.

E/S et fichiers standard

Avant d'entrer dans les détails des expressions régulières, il convient de mentionner le modèle que la plupart des systèmes ont pour les flux de texte. En voici un bref (incomplet) résumé :

  1. Le texte est traité comme un (seul) flux de caractères.
  2. Ce flux peut provenir d'un fichier de texte Unicode ou ASCII ou d'une entrée standard (clavier) ou d'une connexion réseau distante. Après le traitement, disons par un script regex, la sortie va soit à un fichier ou à un flux réseau, soit à la sortie standard (e.g, console)
  3. Le flux se compose d'une ou plusieurs lignes. Chaque ligne a zéro ou plusieurs caractères suivis d'un saut de ligne.

Par souci de simplicité, je veux que vous imaginiez qu'un fichier est composé de lignes se terminant par un caractère de nouvelle ligne. Nous décomposons ce fichier en lignes individuelles (ou chaînes) chacune se terminant par une nouvelle ligne ou un caractère normal (pour la dernière ligne).

Regex et chaîne

Une regex n'a rien de particulier à voir avec les fichiers. Imaginez-le comme une boîte noire qui peut prendre en entrée n'importe quelle chaîne arbitraire de n'importe quelle longueur (finie) et une fois qu'elle atteint la fin de cette chaîne, elle peut soit :

  1. Accepter la chaîne. En d'autres termes, la chaîne allumettes l'expression régulière (regex).
  2. Rejeter la chaîne, je.e, la chaîne ne correspondre l'expression régulière (regex).

Malgré sa nature de boîte noire, j'ajouterai quelques contraintes supplémentaires à cette machine. Une expression régulière lit une chaîne séquentiellement, de gauche à droite, et il ne lit qu'un caractère à la fois. Donc une chaîne « Linux Hint » avec être lu comme :

'L"i"n"u"x"H"i"n"t' [De gauche à droite]

Commençons simplement

Le type de regex le plus simpliste serait de rechercher et de faire correspondre une chaîne 'C'. L'expression régulière pour cela est juste 'C'. Assez banal. La façon de le faire en Python vous obligerait à importer d'abord le module d'expressions régulières.

>>> importer re

On utilise alors la fonction re.rechercher(motif, chaîne) où schéma est notre expression régulière et chaîne dans la chaîne d'entrée dans laquelle nous recherchons le motif.

>>> re.search('C', 'Cette phrase contient un C délibéré')

La fonction prend le motif 'C', le recherche dans la chaîne d'entrée et imprime l'emplacement (span) où se trouve ledit motif. Cette partie de la chaîne, cette sous-chaîne correspond à notre expression régulière. S'il n'y avait pas une telle correspondance trouvée, la sortie serait un Rien objet.

De même, vous pouvez rechercher le modèle « expression régulière » comme suit :

>>>re.search("expression régulière", "Nous pouvons utiliser des expressions régulières pour rechercher des modèles.”)

ré.recherche() , re.match() et re.correspondance parfaite()

Trois fonctions utiles du module re incluent :

1.  ré.rechercher(motif, chaîne)

Cela renvoie la sous-chaîne qui correspond au modèle, comme nous l'avons vu ci-dessus. Si aucune correspondance n'est trouvée, alors Rien est retourné. Si plusieurs sous-chaînes sont conformes à un modèle donné, seule la première occurrence est signalée.

2.  ré.correspondre(motif, chaîne)

Cette fonction essaie de faire correspondre le modèle fourni depuis le début de la chaîne. S'il rencontre une pause quelque part à mi-chemin, il revient Rien.

Par example,

>>> re.match("Joh", "John Doe")

Alors que la chaîne « Mon nom est John Doe » ne correspond pas, et donc Rien est retourné.

>>> imprimer(re.match("Joh", "Je m'appelle John Doe"))
Rien

3.  ré.correspondance parfaite(motif, chaîne)

Ceci est plus strict que les deux ci-dessus et essaie de trouver une correspondance exacte du motif dans la chaîne, sinon la valeur par défaut est Rien.

>>> imprimer(re.fullmatch("Joh", "Joh"))

# Tout le reste ne sera pas un match

j'utiliserai juste le ré.rechercher() fonction dans la suite de cet article. Chaque fois que je dis que la regex accepte cette chaîne, cela signifie qu'athe ré.rechercher() La fonction a trouvé une sous-chaîne correspondante dans la chaîne d'entrée et l'a renvoyée, au lieu de Rienobjet.

Caractères spéciaux

Les expressions régulières comme 'John' et 'C' ne sont pas très utiles. Nous avons besoin de caractères spéciaux qu'une signification spécifique dans le contexte des expressions régulières. Voici quelques exemples:

    1. ^ - Cela correspond au début d'une chaîne. Par exemple, '^C' correspondra à toutes les chaînes commençant par la lettre C.
    2. $ - Cela correspond à la fin de la ligne.
    3. . - Le point sert à indiquer un ou plusieurs caractères, à l'exception du saut de ligne.
    4. * - C'est à zéro ou plus caractère de ce qui l'a précédé. Donc b* correspond à 0 ou plusieurs occurrences de b. ab* correspond uniquement à a, ab et a
    5. + - C'est à un ou plusieurs personnage de ce qui l'a précédé. Donc b+ correspond à 1 ou plusieurs occurrences de b. ab* correspond à a, ab et a
    6. \ - La barre oblique inverse est utilisée comme séquence d'échappement dans les expressions régulières. Donc, si vous voulez qu'une expression régulière recherche la présence littérale du symbole dollar '$' au lieu de la fin de la ligne. Vous pouvez écrire \$ dans une expression régulière.
    7. Les accolades peuvent être utilisées pour spécifier le nombre de répétitions que vous souhaitez voir. Par exemple, un motif comme ab10 signifie que la chaîne a suivie de 10 b correspondra à ce motif. Vous pouvez également spécifier une plage de nombres, comme b4,6 correspond à des chaînes contenant b répétées 4 à 6 fois consécutivement. Le modèle pour 4 répétitions ou plus nécessiterait juste une virgule de fin, comme b4,
    8. Crochets et plage de caractères. RE comme [0-9] peut agir comme un espace réservé pour n'importe quel chiffre entre 0 et 9. De même, vous pouvez avoir des chiffres entre un et cinq [1-5] ou pour correspondre à n'importe quelle lettre majuscule, utilisez [A-Z] ou pour n'importe quelle lettre de l'alphabet, qu'elle soit majuscule ou minuscule, utilisez [A-z].
      Par exemple, toute chaîne composée d'exactement dix chiffres correspond à l'expression régulière [0-9]10, très utile lorsque vous recherchez des numéros de téléphone dans une chaîne donnée.
    9. Vous pouvez créer une instruction similaire à OR, en utilisant | caractère où une expression régulière est composée de deux ou plusieurs expressions régulières, disons, A et B. L'expression régulière A|B est une correspondance si la chaîne d'entrée est une correspondance pour l'expression régulière A ou pour B.
    10. Vous pouvez regrouper différentes expressions régulières. Par exemple, l'expression régulière (A|B)C correspondra aux expressions régulières pour AC et

Il y a beaucoup plus à couvrir, mais je recommanderais d'apprendre au fur et à mesure au lieu de surcharger votre cerveau avec beaucoup de symboles obscurs et de cas extrêmes. En cas de doute, les Python Docs sont d'une grande aide et maintenant vous en savez assez pour suivre les docs facilement.

Expérience pratique et références

Si vous voulez voir une interprétation visuelle de votre regex, vous pouvez visiter Debuggex. Ce site génère une vue de votre regex en temps réel et vous permet de la tester par rapport à diverses chaînes d'entrée.

Pour en savoir plus sur l'aspect théorique des expressions régulières, vous pouvez consulter les deux premiers chapitres de Introduction à la théorie du calcul par Michael Sipser. C'est très facile à suivre et montre l'importance des expressions régulières en tant que concept central du calcul lui-même!

Tutoriel OpenTTD
OpenTTD est l'un des jeux de simulation d'entreprise les plus populaires. Dans ce jeu, vous devez créer une merveilleuse entreprise de transport. Cepe...
SuperTuxKart pour Linux
SuperTuxKart est un excellent titre conçu pour vous apporter l'expérience Mario Kart gratuitement sur votre système Linux. C'est assez stimulant et am...
Tutoriel Bataille pour Wesnoth
The Battle for Wesnoth est l'un des jeux de stratégie open source les plus populaires auxquels vous pouvez jouer en ce moment. Non seulement ce jeu es...