Python-String-Matching ohne komplexe RegEx-Syntax

Python-String-Matching ohne komplexe RegEx-Syntax

Quellknoten: 1935271

Python-String-Matching ohne komplexe RegEx-Syntax
Bild vom Autor
 

Ich habe eine Hassliebe zu regulären Ausdrücken (RegEx), insbesondere in Python. Ich finde es toll, wie Sie Zeichenfolgen extrahieren oder abgleichen können, ohne mehrere logische Funktionen schreiben zu müssen. Es ist sogar besser als die String-Suchfunktion. 

Was ich nicht mag, ist, wie schwer es mir fällt, RegEx-Muster zu lernen und zu verstehen. Ich kann mit einfachen Zeichenfolgenabgleichen umgehen, z. B. alle alphanumerischen Zeichen extrahieren und den Text für NLP-Aufgaben bereinigen. Schwieriger wird es, wenn es darum geht, IP-Adressen, E-Mails und IDs aus Junk-Text zu extrahieren. Sie müssen ein komplexes RegEx-String-Muster schreiben, um das erforderliche Element zu extrahieren. 

Um komplexe RegEx-Aufgaben einfach zu machen, werden wir etwas über ein einfaches Python-Paket namens lernen prägex. Darüber hinaus werden wir uns einige Beispiele für das Extrahieren von Daten und E-Mails aus einer langen Textfolge ansehen.  

Pregex ist eine übergeordnete API, die auf dem `re`-Modul aufbaut. Es ist ein RegEx ohne komplexe RegEx-Muster, die es jedem Programmierer leicht machen, reguläre Ausdrücke zu verstehen und sich daran zu erinnern. Darüber hinaus müssen Sie keine Muster gruppieren oder Metazeichen maskieren, und es ist modular aufgebaut. 

Sie können die Bibliothek einfach mit PIP installieren.

pip install pregex

 

Um die leistungsstarke Funktionalität von PRegEx zu testen, verwenden wir modifizierten Beispielcode aus der Dokumentation

Im folgenden Beispiel extrahieren wir entweder eine HTTP-URL oder eine IPv4-Adresse mit einer Portnummer. Wir müssen dafür keine komplexe Logik erstellen. Wir können die eingebauten Funktionen „HttpUrl“ und „IPv4“ verwenden.

  1. Erstellen Sie eine Portnummer mit AnyDigit(). Die erste Ziffer des Ports sollte nicht Null sein, und die nächsten drei Ziffern können eine beliebige Zahl sein. 
  2. Verwenden Sie Entweder(), um mehrere zu extrahierende Logiken hinzuzufügen, entweder HTTP-URL oder IP-Adresse mit einer Portnummer. 
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
)

 

Wir werden eine lange Textfolge mit Zeichen und Beschreibungen verwenden. 

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

 

Bevor wir den passenden String extrahieren, schauen wir uns das RegEx-Muster an. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Output

Wie wir sehen können, ist es schwer zu lesen oder gar zu verstehen, was vor sich geht. Hier glänzt PRegEx. Um Ihnen eine benutzerfreundliche API zur Durchführung komplexer Aufgaben mit regulären Ausdrücken bereitzustellen. 

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

 

Genau wie bei „re.match“ werden wir „.get_matches(text)“ verwenden, um die erforderliche Zeichenfolge zu extrahieren.

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

 

Output

Wir haben sowohl die IP-Adresse mit Portnummer als auch zwei Web-URLs extrahiert. 

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

Schauen wir uns ein paar Beispiele an, an denen wir das volle Potenzial von PRegEx verstehen können. 

In diesem Beispiel werden wir bestimmte Arten von Datumsmustern aus dem folgenden Text extrahieren.

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

 

Durch die Verwendung von Exactly() und AnyDigit() erstellen wir Tag, Monat und Jahr des Datums. Tag und Monat sind zweistellig, das Jahr vierstellig. Sie werden durch „-“ Bindestriche getrennt.

Nach dem Erstellen des Musters führen wir `get_match` aus, um den passenden String zu extrahieren. 

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)

 

Output

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

 

Schauen wir uns das RegEx-Muster an, indem wir die Funktion `get_pattern()` verwenden. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Output

Wie wir sehen können, hat es eine einfache RegEx-Syntax. 

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

Das zweite Beispiel ist etwas komplex, bei dem wir gültige E-Mail-Adressen aus Junk-Text extrahieren. 

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

 

  • Erstellen Sie Benutzer Muster mit `OneOrMore()`. Wir werden `AnyButFrom()` verwenden, um „@“ und Leerzeichen aus der Logik zu entfernen. 
  • Ähnlich wie a Benutzer Muster erstellen wir a Unternehmen Muster durch Entfernen des zusätzlichen Zeichens „.“ aus der Logik.
  • NB: Domain,  Wir werden `MatchAtLineEnd()` verwenden, um die Suche am Ende mit zwei oder mehr Zeichen außer „@“, Leerzeichen und Punkt zu beginnen.  
  • Kombiniere alle drei, um das endgültige Muster zu erstellen: Benutzer@Firma.Domain.
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)

 

Output

Wie wir sehen können, hat PREgEx zwei gültige E-Mail-Adressen identifiziert. 

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

 

Hinweis: beide Codebeispiele sind modifizierte Versionen der Arbeit von Der PyCoach

Wenn Sie ein Datenwissenschaftler, Analyst oder NLP-Enthusiast sind, sollten Sie PRegEx verwenden, um den Text zu bereinigen und eine einfache Logik zu erstellen. Es reduziert Ihre Abhängigkeit von NLP-Frameworks, da der Großteil des Abgleichs über eine einfache API erfolgen kann. 

In diesem Mini-Tutorial haben wir das Python-Paket PRegEx und seine Anwendungsfälle anhand von Beispielen kennengelernt. Sie können mehr erfahren, indem Sie den Beamten lesen Dokumentation oder Lösen von a eine Wortleitung Problem mit programmierbaren regulären Ausdrücken.

 
 
Abid Ali Awan (@1abidaliawan) ist ein zertifizierter Datenwissenschaftler, der es liebt, Modelle für maschinelles Lernen zu erstellen. Derzeit konzentriert er sich auf die Erstellung von Inhalten und schreibt technische Blogs zu maschinellem Lernen und Data-Science-Technologien. Abid hat einen Master-Abschluss in Technologiemanagement und einen Bachelor-Abschluss in Telekommunikationstechnik. Seine Vision ist es, ein KI-Produkt mit einem grafisch-neuronalen Netzwerk für Schüler zu entwickeln, die mit psychischen Erkrankungen zu kämpfen haben.
 

Zeitstempel:

Mehr von KDnuggets