Python String Matching zonder complexe RegEx-syntaxis

Python String Matching zonder complexe RegEx-syntaxis

Bronknooppunt: 1935271

Python String Matching zonder complexe RegEx-syntaxis
Afbeelding door auteur
 

Ik heb een haat-liefdeverhouding met reguliere expressies (RegEx), vooral in Python. Ik vind het geweldig hoe je strings kunt extraheren of matchen zonder meerdere logische functies te schrijven. Het is zelfs beter dan de String-zoekfunctie. 

Wat ik niet leuk vind, is hoe moeilijk het voor mij is om RegEx-patronen te leren en te begrijpen. Ik kan omgaan met eenvoudige String-matching, zoals het extraheren van alle alfanumerieke tekens en het opschonen van de tekst voor NLP-taken. Het wordt moeilijker als het gaat om het extraheren van IP-adressen, e-mails en ID's uit ongewenste tekst. U moet een complex RegEx String-patroon schrijven om het vereiste item te extraheren. 

Om complexe RegEx-taken eenvoudig te maken, leren we over een eenvoudig Python-pakket genaamd pregex. Verder zullen we ook enkele voorbeelden bekijken van het extraheren van datums en e-mails uit een lange reeks tekst.  

Pregex is een hoger niveau API gebouwd bovenop de `re` module. Het is een RegEx zonder complexe RegEx-patronen die het voor elke programmeur gemakkelijk maken om reguliere expressies te begrijpen en te onthouden. Bovendien hoef je geen patronen te groeperen of metatekens te ontsnappen, en het is modulair. 

U kunt de bibliotheek eenvoudig installeren met behulp van PIP.

pip install pregex

 

Om de krachtige functionaliteit van PRegEx te testen, gebruiken we gewijzigde voorbeeldcode uit de documentatie

In het onderstaande voorbeeld extraheren we een HTTP-URL of een IPv4-adres met een poortnummer. We hoeven er geen complexe logica voor te creëren. We kunnen ingebouwde functies `HttpUrl` en `IPv4` gebruiken.

  1. Maak een poortnummer met behulp van AnyDigit(). Het eerste cijfer van de poort mag niet nul zijn en de volgende drie cijfers kunnen elk getal zijn. 
  2. Gebruik Ofwel() om meerdere logica's toe te voegen om te extraheren, HTTP-URL of IP-adres met een poortnummer. 
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
)

 

We gebruiken een lange reeks tekst met tekens en beschrijvingen. 

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

 

Laten we, voordat we de overeenkomende tekenreeks extraheren, naar het RegEx-patroon kijken. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

uitgang

Zoals we kunnen zien, is het moeilijk te lezen of zelfs maar te begrijpen wat er aan de hand is. Dit is waar PRegEx uitblinkt. Om u een mensvriendelijke API te bieden voor het uitvoeren van complexe reguliere expressietaken. 

(?: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}

 

Net als `re.match`, zullen we `.get_matches(text)` gebruiken om de vereiste string te extraheren.

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

 

uitgang

We hebben zowel het IP-adres met poortnummer als twee web-URL's geëxtraheerd. 

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

Laten we een paar voorbeelden bekijken waarin we het volledige potentieel van PRegEx kunnen begrijpen. 

In dit voorbeeld halen we bepaalde soorten datumpatronen uit de onderstaande tekst.

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

 

Door Exactly() en AnyDigit() te gebruiken, creëren we de dag, maand en jaar van de datum. De dag en maand hebben twee cijfers, terwijl het jaar 4 cijfers heeft. Ze worden gescheiden door "-" streepjes.

Nadat we het patroon hebben gemaakt, voeren we `get_match` uit om de overeenkomende tekenreeks te extraheren. 

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)

 

uitgang

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

 

Laten we eens kijken naar het RegEx-patroon met behulp van de functie `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

uitgang

Zoals we kunnen zien, heeft het een eenvoudige RegEx-syntaxis. 

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

Het tweede voorbeeld is een beetje ingewikkeld, waar we geldige e-mailadressen uit ongewenste tekst zullen halen. 

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

 

  • Maak een gebruiker patroon met `OneOrMore()`. We zullen `AnyButFrom()` gebruiken om “@” en spatie uit de logica te verwijderen. 
  • Vergelijkbaar met a gebruiker patroon creëren we een afstand patroon door het extra teken "." vanuit de logica.
  • Voor de domein,  we zullen `MatchAtLineEnd()` gebruiken om de zoekopdracht vanaf het einde te starten met twee of meer tekens behalve "@", spatie en punt.  
  • Combineer ze alle drie om het uiteindelijke patroon te maken: gebruiker@bedrijf.domein.
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)

 

uitgang

Zoals we kunnen zien, heeft PRegEx twee geldige e-mailadressen geïdentificeerd. 

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

 

Opmerking: beide codevoorbeelden zijn gewijzigde versies van het werk van De PyCoach

Als u een datawetenschapper, analist of NLP-enthousiasteling bent, moet u PRegEx gebruiken om de tekst op te schonen en eenvoudige logica te creëren. Het vermindert uw afhankelijkheid van NLP-frameworks, aangezien de meeste matching kan worden gedaan met behulp van een eenvoudige API. 

In deze mini-tutorial hebben we geleerd over het Python-pakket PRegEx en de use cases met voorbeelden. U kunt meer leren door de ambtenaar te lezen documentatie of het oplossen van een woord probleem bij het gebruik van programmeerbare reguliere expressies.

 
 
Abid Ali Awan (@1abidaliawan) is een gecertificeerde datawetenschapper-professional die dol is op het bouwen van machine learning-modellen. Momenteel richt hij zich op het creëren van content en het schrijven van technische blogs over machine learning en data science-technologieën. Abid heeft een Master in Technologie Management en een Bachelor in Telecommunicatie Engineering. Zijn visie is om een ​​AI-product te bouwen met behulp van een grafisch neuraal netwerk voor studenten die worstelen met een psychische aandoening.
 

Tijdstempel:

Meer van KDnuggets