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 de hiéroglyphes vraiment obscure que l'on copie généralement d'Internet et colle dans son code. Ce mystérieux sort montre alors des capacités magiques de trouver des modèles à l'intérieur des chaînes de texte et si nous le demandons bien, 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 URL (et que Dieu vous aide si vous en écrivez un à partir de zéro), vous voulez souvent afficher le même résultat, indépendamment du suivi '/' dans l'URL. E.g https: // Exemple.com / utilisateur / paramètres / et https: // exemple.com / utilisateur / Paramètres devraient tous deux pointer la même page malgré le suivant '/'.

Cependant, vous ne pouvez pas ignorer toutes les barres obligées, comme:

  1. La barre obligatoire entre «utilisateur» et «Paramètres», E, «utilisateur / paramètres».
  2. Vous devrez également prendre en compte le '//' au début de votre FQDN suivi de 'https'.

Donc, vous trouvez une règle comme: «Ignorez juste les barres obligées suivie d'un espace vide."Et si vous le souhaitez, vous pouvez encoder cette règle avec une série de déclarations IF-Else. Mais cela deviendra lourd assez rapidement. Vous pouvez écrire une fonction disant CleanUrl () qui peut résumer cela pour vous. Mais l'univers commencera bientôt à vous lancer plus de boules de courbe. 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.

IO 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. Voici un court résumé (incomplet):

  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 de l'entrée standard (clavier) ou d'une connexion réseau distante. Après le traitement, disons par un script Regex, la sortie passe à un fichier ou à un flux de réseau ou à la sortie standard (E.G, console)
  3. Le flux se compose d'une ou plusieurs lignes. Chaque ligne n'a zéro ou plus de personnages suivis d'une nouvelle ligne.

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

Regex et chaîne

Un regex n'a rien, en particulier, avec les fichiers. Imaginez-le comme une boîte noire qui peut prendre en entrée n'importe quelle chaîne arbitraire de toute 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 fait pas correspondre l'expression régulière (regex).

Malgré sa nature noire, j'ajouterai quelques autres contraintes à ce machinaire. Un regex lit une chaîne séquentiellement, De gauche à droite, et il ne lit un seul personnage à la fois. Donc une chaîne "Linuxhint" avec être lu comme:

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

Commençons simples

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

>>> Importer Re

Nous utilisons ensuite la fonction RE.recherche(motif, chaîne) où modèle est notre expression régulière et chaîne dans la chaîne d'entrée dans laquelle nous recherchons le motif.

>>> re.Recherche («C», «Cette phrase a un C délibéré dedans»)

La fonction prend le motif «C», la recherche dans la chaîne d'entrée et imprime l'emplacement (Span) où ledit modèle se trouve. Cette partie de la chaîne, cette sous-chaîne est ce qui correspond à notre expression régulière. S'il n'y avait pas de correspondance de ce type, la sortie serait un Aucun objet.

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

>>> re.Recherche («Expression régulière», «Nous pouvons utiliser des expressions régulières pour la recherche de modèles.»)

concernant.search (), re.match () et re.correspondance parfaite()

Trois fonctions utiles du module RE comprennent:

concernant.recherche(motif, chaîne)

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

concernant.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 Aucun.

Par exemple,

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

Où comme la chaîne «Mon nom est John Doe» n'est pas un match, et donc Aucun est retourné.

>>> imprimer (re.Match («Joh», «Mon nom est John Doe»))
Aucun

concernant.correspondance parfaite(motif, chaîne)

Ceci est plus stric Aucun.

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

# Tout le reste ne sera pas un match

J'utiliserai juste le concernant.recherche() fonction dans le reste de cet article. Chaque fois, je dis que le regex accepte cette chaîne, cela signifie que ATHE concernant.recherche() La fonction a trouvé une sous-chaîne correspondante dans la chaîne d'entrée et a renvoyé cela, au lieu de Aucunobjet.

Caractères spéciaux

Des expressions régulières comme «John» et «C» ne sont pas très utiles. Nous avons besoin de caractères spéciaux dont une moyenne 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 qui commencent par la lettre C.
    2. $ - Cela correspond à la fin de la ligne.
    3. . - Le point doit indiquer un ou plusieurs caractères, à l'exception de la nouvelle ligne.
    4. * - c'est à zéro ou plus de caractère de ce qui l'a précédé. Donc b * correspond à 0 ou plusieurs occurrences de b. ab * correspond à un, AB et un
    5. + - C'est à un ou plusieurs caractère de ce qui l'a précédé. Donc b + correspond à 1 ou plusieurs occurrences de b. ab * correspond à un, AB et un
    6. \ - BackSlash est utilisé comme séquence d'évasion dans les experts. Donc, vous voulez une expression régulière pour rechercher la présence littérale du symbole du dollar '$' au lieu de la fin de la ligne. Vous pouvez écrire \ $ en expression régulière.
    7. Les accolades bouclées peuvent être utilisées pour spécifier le nombre de répétitions que vous souhaitez voir. Par exemple, un modèle comme AB 10 signifie que la chaîne A suivie de 10 B correspondra à ce modèle. Vous pouvez également spécifier une gamme de nombres, comme B 4,6 correspond aux chaînes contenant b répété 4 à 6 fois consécutivement. Le motif de 4 répétitions ou plus nécessiterait juste une virgule traînante, comme si b 4,
    8. Carrés et gamme de caractères. 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 à toute utilisation de lettre majuscutive [A-Z] ou pour toute lettre de l'alphabet, quelle que soit son utilisation supérieure ou minuscule [A-Z].
      Par exemple, toute chaîne faite de dix chiffres exactement 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 ou similaire, en utilisant | caractère où une expression régulière est composée de deux expressions régulières ou plus, disons, A et B. Le regex a | b est une correspondance si la chaîne d'entrée correspond soit à une correspondance régulière, ou pour b.
    10. Vous pouvez regrouper différents experts ensemble. Par exemple, le regex (a | b) C correspondra aux regexans pour AC et

Il y a beaucoup plus à couvrir, mais je vous recommande d'apprendre au lieu de surcharger votre cerveau avec beaucoup de symboles obscurs et de cas de bord. En cas de doute, les documents Python sont d'une grande aide et maintenant vous en savez assez pour suivre facilement les documents.

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 le tester contre diverses chaînes d'entrée.

Pour en savoir plus sur l'aspect théorique des expressions régulières, vous voudrez peut-être examiner les deux premiers chapitres de l'introduction à la théorie du calcul de Michael Sipser. Il est très facile à suivre et montre l'importance des expressions régulières comme un concept principal de calcul lui-même!