Correspondance de chaînes Python sans syntaxe RegEx complexe

Correspondance de chaînes Python sans syntaxe RegEx complexe

Nœud source: 1935271

Correspondance de chaînes Python sans syntaxe RegEx complexe
Image par auteur
 

J'ai une relation d'amour et de haine avec les expressions régulières (RegEx), en particulier en Python. J'aime la façon dont vous pouvez extraire ou faire correspondre des chaînes sans écrire plusieurs fonctions logiques. C'est encore mieux que la fonction de recherche de chaîne. 

Ce que je n'aime pas, c'est à quel point il m'est difficile d'apprendre et de comprendre les modèles RegEx. Je peux gérer de simples correspondances de chaînes, telles que l'extraction de tous les caractères alphanumériques et le nettoyage du texte pour les tâches NLP. Les choses se compliquent lorsqu'il s'agit d'extraire des adresses IP, des e-mails et des identifiants à partir de texte indésirable. Vous devez écrire un modèle de chaîne RegEx complexe pour extraire l'élément requis. 

Pour simplifier les tâches RegEx complexes, nous découvrirons un package Python simple appelé prégex. En outre, nous examinerons également quelques exemples d'extraction de dates et d'e-mails à partir d'une longue chaîne de texte.  

Prégex est une API de niveau supérieur construite au-dessus du module `re`. Il s'agit d'un RegEx sans modèles RegEx complexes qui permettent à tout programmeur de comprendre et de mémoriser facilement les expressions régulières. De plus, vous n'avez pas besoin de grouper des modèles ou de métacaractères d'échappement, et c'est modulaire. 

Vous pouvez simplement installer la bibliothèque à l'aide de PIP.

pip install pregex

 

Pour tester la fonctionnalité puissante de PRegEx, nous utiliserons un exemple de code modifié du Documentation

Dans l'exemple ci-dessous, nous extrayons soit une URL HTTP, soit une adresse IPv4 avec un numéro de port. Nous n'avons pas besoin de créer une logique complexe pour cela. Nous pouvons utiliser les fonctions intégrées `HttpUrl` et `IPv4`.

  1. Créez un numéro de port à l'aide de AnyDigit(). Le premier chiffre du port ne doit pas être zéro et les trois chiffres suivants peuvent être n'importe quel nombre. 
  2. Utilisez Soit() pour ajouter plusieurs logiques à extraire, soit une URL HTTP, soit une adresse IP avec un numéro de port. 
from pregex.core.pre import Pregex
from pregex.core.classes import AnyDigit
from pregex.core.operators import Either
from pregex.meta.essentials import HttpUrl, IPv4 port_number = (AnyDigit() - '0') + 3 * AnyDigit() pre = Either( HttpUrl(capture_domain=True, is_extensible=True), IPv4(is_extensible=True) + ':' + port_number
)

 

Nous utiliserons une longue chaîne de texte avec des caractères et des descriptions. 

text = """IPV4--192.168.1.1:8000-- address--https://www.abid.works-- website--https://kdnuggets.com--text"""

 

Avant d'extraire la chaîne correspondante, examinons le modèle RegEx. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Sortie

Comme nous pouvons le voir, il est difficile de lire ou même de comprendre ce qui se passe. C'est là que PRegEx brille. Pour vous fournir une API conviviale pour effectuer des tâches d'expression régulière complexes. 

(?:https?://)?(?:www.)?(?:[a-zdA-Z][a-z-dA-Z]{,61}[a-zdA-Z].)*([a-zdA-Z][a-z-dA-Z]{,61}[a-zdA-Z]).[a-z]{2,6}(?::d{1,4})?(?:/[!-.0-~]+)*/?(?:(?=[!-/[-`{-~:-@])|(?=w))|(?:(?:d|[1-9]d|1d{2}|2(?:[0-4]d|5[0-5])).){3}(?:d|[1-9]d|1d{2}|2(?:[0-4]d|5[0-5])):[1-9]d{3}

 

Tout comme `re.match`, nous utiliserons `.get_matches(text)` pour extraire la chaîne requise.

results = pre.get_matches(text)
print(results)

 

Sortie

Nous avons extrait à la fois l'adresse IP avec le numéro de port et deux URL Web. 

['192.168.1.1:8000', 'https://www.abid.works', 'https://kdnuggets.com']

Regardons quelques exemples où nous pouvons comprendre tout le potentiel de PRegEx. 

Dans cet exemple, nous allons extraire certains types de modèles de date du texte ci-dessous.

text = """ 04-15-2023 2023-08-15 06-20-2023 06/24/2023 """

 

En utilisant Exactly() et AnyDigit(), nous allons créer le jour, le mois et l'année de la date. Le jour et le mois ont deux chiffres, alors que l'année a 4 chiffres. Ils sont séparés par des tirets "-".

Après avoir créé le modèle, nous exécuterons `get_match` pour extraire la chaîne correspondante. 

from pregex.core.classes import AnyDigit
from pregex.core.quantifiers import Exactly day_or_month = Exactly(AnyDigit(), 2) year = Exactly(AnyDigit(), 4) pre = ( day_or_month + "-" + day_or_month + "-" + year
) results = pre.get_matches(text)
print(results)

 

Sortie

['04-15-2023', '06-20-2023']

 

Regardons le modèle RegEx en utilisant la fonction `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Sortie

Comme nous pouvons le voir, il a une syntaxe RegEx simple. 

d{2}-d{2}-d{4}

Le deuxième exemple est un peu complexe, où nous allons extraire des adresses e-mail valides du texte indésirable. 

text = """ user1@abid.works editorial@@kdnuggets.com lover@python.gg. editorial1@kdnuggets.com """

 

  • Créer un utilisateur motif avec `OneOrMore()`. Nous utiliserons `AnyButFrom()` pour supprimer "@" et l'espace de la logique. 
  • Similaire à un utilisateur modèle nous créons un Société modèle en supprimant le caractère supplémentaire "." de la logique.
  • Pour le domaine,  nous utiliserons `MatchAtLineEnd()` pour démarrer la recherche à partir de la fin avec deux caractères ou plus sauf "@", espace et point.  
  • Combinez les trois pour créer le motif final : utilisateur@entreprise.domaine.
from pregex.core.classes import AnyButFrom
from pregex.core.quantifiers import OneOrMore, AtLeast
from pregex.core.assertions import MatchAtLineEnd user = OneOrMore(AnyButFrom("@", ' '))
company = OneOrMore(AnyButFrom("@", ' ', '.'))
domain = MatchAtLineEnd(AtLeast(AnyButFrom("@", ' ', '.'), 2)) pre = ( user + "@" + company + '.' + domain
) results = pre.get_matches(text)
print(results)

 

Sortie

Comme nous pouvons le voir, PRegEx a identifié deux adresses e-mail valides. 

['user1@abid.works', 'editorial1@kdnuggets.com']

 

Remarque: les deux exemples de code sont des versions modifiées du travail de Le PyCoach

Si vous êtes un scientifique des données, un analyste ou un passionné de PNL, vous devez utiliser PRegEx pour nettoyer le texte et créer une logique simple. Cela réduira votre dépendance aux frameworks NLP car la plupart des correspondances peuvent être effectuées à l'aide d'une simple API. 

Dans ce mini tutoriel, nous avons découvert le package Python PRegEx et ses cas d'utilisation avec des exemples. Vous pouvez en savoir plus en lisant l'officiel Documentation ou résoudre un une ligne de mot problème d'utilisation d'expressions régulières programmables.

 
 
Abid Ali Awan (@1abidaliawan) est un spécialiste des données certifié qui aime créer des modèles d'apprentissage automatique. Actuellement, il se concentre sur la création de contenu et la rédaction de blogs techniques sur les technologies d'apprentissage automatique et de science des données. Abid est titulaire d'une maîtrise en gestion de la technologie et d'un baccalauréat en génie des télécommunications. Sa vision est de créer un produit d'IA utilisant un réseau de neurones graphiques pour les étudiants aux prises avec une maladie mentale.
 

Horodatage:

Plus de KDnuggetsGenericName