Python-merkkijonovastaavuus ilman monimutkaista RegEx-syntaksia

Python-merkkijonovastaavuus ilman monimutkaista RegEx-syntaksia

Lähdesolmu: 1935271

Python-merkkijonovastaavuus ilman monimutkaista RegEx-syntaksia
Kuva tekijältä
 

Minulla on rakkaus-ja viha-suhde säännöllisiin lausekkeisiin (RegEx), erityisesti Pythonissa. Rakastan kuinka voit purkaa tai sovittaa merkkijonoja kirjoittamatta useita loogisia toimintoja. Se on jopa parempi kuin merkkijonohakutoiminto. 

En pidä siitä, että minun on vaikea oppia ja ymmärtää RegEx-malleja. Pystyn käsittelemään yksinkertaisia ​​merkkijonojen sovituksia, kuten poimimaan kaikki aakkosnumeeriset merkit ja puhdistamaan tekstin NLP-tehtäviä varten. Asiat vaikeutuvat, kun tulee poimimaan IP-osoitteita, sähköposteja ja tunnuksia roskatekstistä. Sinun on kirjoitettava monimutkainen RegEx-merkkijonokuvio, jotta voit purkaa vaaditun kohteen. 

Jotta monimutkaiset RegEx-tehtävät olisivat yksinkertaisia, opimme yksinkertaisesta Python-paketista nimeltä pregex. Lisäksi tarkastelemme myös muutamia esimerkkejä päivämäärien ja sähköpostien poimimisesta pitkästä tekstijonosta.  

Pregex on korkeamman tason API, joka on rakennettu "re"-moduulin päälle. Se on RegEx ilman monimutkaisia ​​RegEx-malleja, joiden avulla ohjelmoijat voivat helposti ymmärtää ja muistaa säännöllisiä lausekkeita. Lisäksi sinun ei tarvitse ryhmitellä malleja tai paeta metamerkkejä, ja se on modulaarinen. 

Voit yksinkertaisesti asentaa kirjaston käyttämällä PIP:tä.

pip install pregex

 

Testataksemme PRegExin tehokkaita toimintoja, käytämme muokattua mallikoodia dokumentointi

Alla olevassa esimerkissä poimimme joko HTTP-URL-osoitteen tai IPv4-osoitteen porttinumerolla. Meidän ei tarvitse luoda monimutkaista logiikkaa sille. Voimme käyttää sisäänrakennettuja toimintoja `HttpUrl` ja `IPv4`.

  1. Luo porttinumero käyttämällä AnyDigit(). Portin ensimmäinen numero ei saa olla nolla, ja seuraavat kolme numeroa voivat olla mikä tahansa luku. 
  2. Lisää joko HTTP-URL-osoite tai IP-osoite porttinumeroineen useiden eri logiikkojen lisäämiseen käyttämällä joko joko()-komentoa. 
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
)

 

Käytämme pitkää tekstijonoa, jossa on merkkejä ja kuvauksia. 

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

 

Ennen kuin poimimme vastaavan merkkijonon, katsotaan RegEx-mallia. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

ulostulo

Kuten näemme, on vaikea lukea tai edes ymmärtää, mitä tapahtuu. Tässä PRegEx loistaa. Tarjoaa sinulle ihmisystävällisen sovellusliittymän monimutkaisten säännöllisten lausekkeiden tehtävien suorittamiseen. 

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

 

Aivan kuten "re.match", käytämme ".get_matches(text)" vaaditun merkkijonon purkamiseen.

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

 

ulostulo

Olemme poimineet sekä IP-osoitteen porttinumeroineen että kaksi web-URL-osoitetta. 

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

Katsotaanpa pari esimerkkiä, joissa voimme ymmärtää PRegExin täyden potentiaalin. 

Tässä esimerkissä poimimme tietyntyyppisiä päivämääräkuvioita alla olevasta tekstistä.

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

 

Käyttämällä Exactly()- ja AnyDigit()-toimintoja luomme päivämäärän, kuukauden ja vuoden. Päivä ja kuukausi ovat kaksinumeroisia, kun taas vuosi on 4 numeroa. Ne on erotettu "-" katkoviivoilla.

Mallin luomisen jälkeen suoritamme komennon "get_match" poimimaan vastaavan merkkijonon. 

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)

 

ulostulo

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

 

Tarkastellaan RegEx-mallia käyttämällä get_pattern()-funktiota. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

ulostulo

Kuten näemme, sillä on yksinkertainen RegEx-syntaksi. 

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

Toinen esimerkki on hieman monimutkainen, jossa poimimme kelvolliset sähköpostiosoitteet roskatekstistä. 

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

 

  • Luo lähettämä kuvio "OneOrMore()". Käytämme "AnyButFrom()" -merkkiä poistamaan "@" ja välilyönti logiikasta. 
  • Samanlainen kuin a lähettämä luomamme malli a yritys kuvio poistamalla ylimääräinen merkki "." logiikasta.
  • Varten verkkotunnuksen,  käytämme `MatchAtLineEnd()-komentoa aloittaaksemme haun lopusta kahdella tai useammalla merkillä paitsi "@", välilyönnillä ja pisteellä.  
  • Yhdistä kaikki kolme luodaksesi lopullisen kuvion: käyttäjä@yritys.verkkotunnus.
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)

 

ulostulo

Kuten näemme, PRegEx on tunnistanut kaksi kelvollista sähköpostiosoitetta. 

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

 

Huomautus: molemmat koodiesimerkit ovat modifioituja versioita työstä PyCoach

Jos olet datatieteilijä, analyytikko tai NLP-harrastaja, sinun tulee käyttää PRegExiä tekstin puhdistamiseen ja yksinkertaisen logiikan luomiseen. Se vähentää riippuvuuttasi NLP-kehyksistä, koska suurin osa sovituksista voidaan tehdä yksinkertaisella API:lla. 

Tässä miniopetusohjelmassa olemme oppineet Python-paketista PRegEx ja sen käyttötapauksista esimerkkien avulla. Voit oppia lisää lukemalla virallista dokumentointi tai ratkaista a sana ongelma ohjelmoitavien säännöllisten lausekkeiden käytössä.

 
 
Abid Ali Awan (@1abidaliawan) on sertifioitu datatieteilijä, joka rakastaa koneoppimismallien rakentamista. Tällä hetkellä hän keskittyy sisällöntuotantoon ja kirjoittaa teknisiä blogeja koneoppimisesta ja datatieteen teknologioista. Abidilla on maisterin tutkinto teknologiajohtamisesta ja kandidaatin tutkinto tietoliikennetekniikasta. Hänen visionsa on rakentaa tekoälytuote graafisen hermoverkon avulla opiskelijoille, jotka kamppailevat mielenterveysongelmista.
 

Aikaleima:

Lisää aiheesta KDnuggets