Python-String-Matching ohne komplexe RegEx-Syntax


Erfahren Sie, wie Sie benutzerfreundliche, programmierbare reguläre Ausdrücke für den komplexen Python-String-Abgleich verwenden.

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

Was mir nicht gefällt, ist, dass es für mich schwierig ist, RegEx-Muster zu lernen und zu verstehen. Ich kann einfache String-Zuordnungen durchführen, etwa alle alphanumerischen Zeichen extrahieren und den Text für NLP-Aufgaben bereinigen. Schwieriger wird es, 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 zu vereinfachen, lernen wir ein einfaches Python-Paket namens pregex kennen. Darüber hinaus werden wir uns einige Beispiele für das Extrahieren von Daten und E-Mails aus einer langen Textfolge ansehen.  

Erste Schritte mit PRegEx

Pregex ist eine übergeordnete API, die auf dem „re“-Modul aufbaut. Es handelt sich um einen RegEx ohne komplexe RegEx-Muster, der es jedem Programmierer erleichtert, 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 über 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 integrierten 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 Each(), um mehrere zu extrahierende Logiken hinzuzufügen, entweder eine HTTP-URL oder eine 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://www.kdnuggets.com--text"""

Bevor wir die passende Zeichenfolge extrahieren, schauen wir uns das RegEx-Muster an. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

Ausgabe

Wie wir sehen, ist es schwer zu lesen oder überhaupt zu verstehen, was vor sich geht. Hier glänzt PRegEx. Bereitstellung einer benutzerfreundlichen API für die Ausführung komplexer regulärer Ausdrucksaufgaben. 

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

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

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

Ausgabe

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

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

Beispiel 1: Datumsformat

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

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

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

Mithilfe von Exactly() und AnyDigit() erstellen wir Tag, Monat und Jahr des Datums. Der Tag und der Monat sind zweistellig, während das Jahr vierstellig ist. Sie werden durch „-“-Bindestriche getrennt.

Nachdem wir das Muster erstellt haben, 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)

Ausgabe

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

Schauen wir uns das RegEx-Muster mit der Funktion „get_pattern()“ an. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

Ausgabe

Wie wir sehen können, verfügt es über eine einfache RegEx-Syntax. 

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

Beispiel 2: E-Mail-Extraktion

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 ein Benutzer-Muster mit „OneOrMore()“. Wir werden „AnyButFrom()“ verwenden, um „@“ und Leerzeichen aus der Logik zu entfernen. 

  • Ähnlich wie bei einem Benutzer-Muster erstellen wir ein Firmen-Muster, indem wir das zusätzliche Zeichen „entfernen“. ” aus der Logik.
  • Für die Domäne verwenden wir „MatchAtLineEnd()“, um die Suche am Ende mit zwei oder mehr beliebigen Zeichen außer „@“, Leerzeichen und Punkt zu beginnen.  
  • Kombinieren Sie alle drei, um das endgültige Muster zu erstellen: user@company.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)

Ausgabe

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 The PyCoach. 

Abschluss

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

In diesem Mini-Tutorial haben wir anhand von Beispielen etwas über das Python-Paket PRegEx und seine Anwendungsfälle gelernt. Sie können mehr erfahren, indem Sie die offizielle Dokumentation lesen oder ein Wortproblem mithilfe programmierbarer regulärer Ausdrücke lösen.