Python-Regex

Fur neue Entwickler können reguläre Ausdrucke (oder Regex, wie sie allgemein bekannt sind) aufgrund der seltsamen, unbekannten Syntax abschreckend sein:

Als ich ein neuer Entwickler war und den obigen Ausdruck zum ersten Mal sah, war mein erster Gedanke "was soll ich sagen? Ich werde dieses Kauderwelsch nie lernen k√∂nnen. Das ist mir zu viel. Ich kann ‚Äôes nicht.‚"

Aber du kannst es! Es geht nur darum, das anfängliche uberwältigende Gefuhl zu uberwinden, dass reguläre Ausdrucke zu fremd sind. Genauso wie das Erlernen oder Sprechen einer Fremdsprache – Sobald Sie den Dreh raus haben, wird es ziemlich naturlich. Versprochen!

In diesem Artikel werfen wir einen Blick darauf, was reguläre Ausdrucke sind, warum sie verwendet werden und wie man sie in Python verwendet. Am Ende dieses Artikels haben Sie ein solides Verständnis von regulären Ausdrucken, sodass Sie interpretieren können, was der obige Ausdruck bedeutet!

Was sind reguläre Ausdrucke?

Wann Wenn wir uns ansehen, was ein regulärer Ausdruck ist, mussen wir uns daran erinnern, was ein String ist. Denken Sie daran, dass eine Zeichenfolge nur eine Ansammlung von Zeichen ist, die aneinandergereiht und von Anfuhrungszeichen umgeben sind:

 &ldquo ;Hallo Welt‚" ‚Äû555-555-5555‚"    "John Doe 123 Main St. Anywhere, USA 99999-9999‚"   "[email protected]‚"

Dies sind alles Beispiele fur Zeichenfolgen. Sie können beliebig lang oder gar nicht lang sein. Reguläre Ausdrucke, oder häufiger als regex abgekurzt, sind Ausdrucke, deren Komponenten Muster mit Strings abgleichen, um Informationen zu erhalten.

81 % der Teilnehmer gaben an Sie fuhlten sich nach dem Besuch eines Bootcamps sicherer in Bezug auf ihre Berufsaussichten im Tech-Bereich. Lassen Sie sich noch heute in ein Bootcamp einweisen.

Der durchschnittliche Bootcamp-Absolvent verbrachte weniger als sechs Monate im Karriereubergang, vom Beginn eines Bootcamps bis zur Suche nach seinem ersten Job.

Das Tolle an Regex ist, dass es sich nicht unbedingt um die Sprache kummert, die Sie in – es ist ziemlich sprachunabhängig. Der Unterschied liegt in den Methoden der Sprache und der Art und Weise, wie Aktionen mit diesen Ausdrucken ausgefuhrt werden.

Wofur werden reguläre Ausdrucke verwendet?

Regex ist ein Muster, das wir gerne hätten speziell in einer Zeichenfolge suchen. Wir können Regex verwenden, um nach einem bestimmten Ausdruck oder Muster zu suchen, um es durch etwas anderes zu ersetzen, oder wir können Formulare validieren, um sicherzustellen, dass ein Benutzer Informationen in einem bestimmten Format eingibt, damit sie fur alle Benutzer konsistent sind.

Suchen und Ersetzen

Angenommen, wir haben eine Telefonnummer in diesem Format:

 555 555 5555 

Dies ist ein gultiges Format fur eine Telefonnummer in den USA. Aber was wäre, wenn wir die Leerzeichen durch Bindestriche ersetzen wollten? Oder fugen Sie Klammern um die Vorwahl und einen Bindestrich hinzu, um sie besser lesbar zu machen?

Dafur können wir reguläre Ausdrucke verwenden! Wir gehen im nächsten Abschnitt darauf ein, wie das mit Python gemacht wird – Im Moment möchte ich, dass Sie ein allgemeines Gefuhl dafur bekommen, was Sie mit regulären Ausdrucken tun können und wie sie nutzlich sein können.

Das Ergebnis, das wir nach einer Suche und Ersetzung einer Telefonnummer in sehen wurden Python fur das Format, das wir verwenden möchten, wäre:

Es ist nicht erforderlich, in regulären Ausdrucken nach einem bestimmten Wert oder Index des Strings zu suchen, weil Wir können einfach nach den Mustern in den Strings suchen und alle Datensätze bearbeiten, die wir abgleichen mussen.

Validieren

Haben Sie jemals etwas auf einer Site ausgefullt, nur damit es angezeigt wird? eine Fehlermeldung wegen eines verpassten Symbols oder eines Musters, dem Sie nicht gefolgt sind? Höchstwahrscheinlich wurden reguläre Ausdrucke verwendet, um sicherzustellen, dass Ihre Eingabe mit dem ubereinstimmt, wonach die Datenbank sucht.

Dies wird als Validierung bezeichnet und ist beim Erstellen von Formularen sehr nutzlich, um sicherzustellen, dass eine Telefonnummer der folgt Format, in dem es sein soll, oder dass eine E-Mail-Adresse eine richtig formatierte E-Mail-Adresse ist oder ein Passwort mit den von Ihnen festgelegten Parametern ubereinstimmt, damit es ein gultiges Passwort ist (Länge, Sonderzeichen, Ziffern, Groß- oder Kleinschreibung). , usw.).

Dies hilft, Fehler in Ihrer Datenbank zu vermeiden, indem der Benutzer auf Tippfehler oder nicht ubereinstimmende Muster aufmerksam gemacht wird.

Im nächsten Abschnitt Wir werden uns die Komponenten oder Mustervergleicher ansehen, die reguläre Ausdrucke erstellen.

Typen von Regex-Mustervergleichern

Buchstaben, Metazeichen und Quantifizierer machen die Arten von Mustervergleichern, die wir in Regex sehen. Ein Mustervergleicher ist ein Zeichen, das verwendet wird, um ein Muster in einer Zeichenfolge zu finden. Es ist der Hauptbaustein eines regulären Ausdrucks.

Literale Zeichen

Das einfachste Beispiel fur einen Mustervergleicher in Regex ist ein Literal. Es stimmt mit einem hartcodierten Zeichen oder einer Zeichenfolge uberein.

Beispiele:

Hallo ‚áí Sammlung von funf verschiedenen Zeichen.

Wenn hier ein Regex-Muster angewendet wird, sucht es nach jedem dieser Zeichen nacheinander. "Hallo‚", "Hallo‚" oder "Hallo‚" eine Musterprufung bestehen wurde, aber "Hallo‚", "helo‚" oder "Hallo‚" wurde nicht.

"Karma-Karma trat in mein Leben, als ich es am dringendsten brauchte und half mir schnell bei einem Bootcamp. Zwei Monate nach meinem Abschluss fand ich meinen Traumjob, der meinen Werten und Zielen entsprach im Leben!"

Venus, Software Engineer bei Rockbot

A ‚áí Sammlung eines einzelnen Zeichens.

Da Regex nach verschiedenen Zeichen sucht, wird auch die Gro√ü-/Kleinschreibung beachtet. Also ‚ÄûA‚" bestanden, aber ‚Äûein‚" wurde nicht. Wir werden gleich darauf eingehen.

Ein einfacher Satz. ‚áí Sammlung mehrerer unterschiedlicher Zeichen.

Regex sucht nacheinander nach jedem Zeichen im Ausdruck, wenn es einen String betrachtet. Wenn ‚ÄûEin einfacher Satz‚" nicht genau so in der gesuchten Zeichenfolge enthalten ist, wie sie in der Regex geschrieben ist, wurde sie nicht passieren.

Escape-Zeichen

Schauen Sie sich das letzte Beispiel an. Beachten Sie, dass ein vor dem Punkt steht. Ein Punkt in der Syntax regulärer Ausdrucke ist gleichbedeutend mit Schlusselwörtern in Sprachen wie JavaScript oder Python.

Sie können einen Punkt/Punkt nicht allein verwenden, wenn er Teil eines Musters in . sein soll Reguläre Ausdrucke. Sie mussen das Zeichen mit Escapezeichen versehen, damit die Engine fur reguläre Ausdrucke dies als wörtliche Darstellung eines Punkts anstelle der Regex-Bedeutung interpretiert.

Hier sind einige andere spezielle Zeichenfolgen, die mussen mit Escapezeichen versehen werden, wenn das Literalzeichen anstelle der ubersetzten Bedeutung verwendet werden soll, in die die Regex-Engine es kompiliert.

  • Asterisk *
  • Backslash /
  • Plus +
  • Caret ^
  • Dollarzeichen $
  • Punkt/Punkt .
  • Pfeife |
  • Frage Markieren ?
  • Klammern ‚Äì beide Arten ()
  • Curly Braces ‚Äì beide Typen {}

Literale Zeichen in Regex stimmen genau mit dem Zeichen uberein, das Sie als Teil des Musters einfugen. Wenn Sie ein oben aufgefuhrtes Zeichen einfugen möchten, mussen Sie es mit Escapezeichen versehen, damit es auch Teil Ihrer Regex sein kann.

Gemeinsame √úbereinstimmungen

Der Zweck von a Matcher ist das Abgleichen mehrerer Buchstaben in einem Muster. Diese Sammlung von Mustervergleichssymbolen ist bei den Programmiersprachen, die Regex verwenden, ziemlich konsistent.

MatcherBeschreibungBeispiel
.Entspricht jedem Zeichennw wurde mit jetzt, naw oder neu usw. ubereinstimmen. Jedes Zeichen besteht den Test
^regexSucht nach Muster bei Zeilenanfang^hello wurde mit hello in einer Zeile ubereinstimmen, die mit diesem Muster beginnt
regex$Sucht nach Muster am Ende der Zeileworld$ wurde mit world in einer Zeile ubereinstimmen, die mit diesem Muster endet
[abc]Übereinstimmungen a, b oder c [misp]wird als Satz betrachtet und wurde mit jeder Zeichenfolge ubereinstimmen, die eines dieser Zeichen enthält.
Beispiel: es könnte mit allen einzelnen Buchstaben in Mississippi und Miss ubereinstimmen, aber nur mit einigen Buchstaben in Marsh und Missouri
[abc][xyz]Matc hes a, b oder c gefolgt von x, y oder z/[Mm][sip]/ wurde auf jeden String passen, der mit M oder m beginnt, gefolgt von einer Menge, die eines der Zeichen in [sip]
[^abc]Nicht a, b oder c[^rstlne] wurden ubereinstimmen jedes Zeichen, das nicht r, s, t, l, n oder e ist
[a-zA-Z0-9]Passt zu jedem Zeichen innerhalb des Bereichs[an] wurde jedem Zeichen zwischen a und n entsprechen. und, end, blind, können, alle haben Zeichen, die hier vollständig ubereinstimmen
A|BA oder BM|m. wurde jedes Wort oder jede Wortgruppe mit einer Länge von mindestens zwei Zeichen finden, die entweder einem M oder einem m plus mindestens einem oder mehreren anderen Zeichen entspricht.
CATEntspricht C, gefolgt von A, gefolgt von Thello world wurde genau hello world entsprechen

Metazeichen

Reguläre Ausdrucke verwenden auch Metazeichen, um ein Muster zu beschreiben. Metazeichen haben eine bestimmte Bedeutung und beschreiben die Form des Musters.

MetazeichenBeschreibungBeispiel
dEntspricht jeder Zifferd wurde 1, 2 oder 3 usw. entsprechen. Abkurzung fur [0-9]
DEntspricht jedem nicht-stelligen Zeichen D wurde A, B, g usw. entsprechen. Abkurzung fur [^0-9]
sEntspricht jedem Whitespace Zeichens wurden neuen Zeilen, Tabulatoren, Leerzeichen usw. entsprechen.
SEntspricht allen nicht -Whitespace-Zeichen S wurde jedem beliebigen Zeichen außer einem Whitespace-Zeichen entsprechen.
wEntspricht jedem WortzeichenEin Wortzeichen, kurz fur [a-zA-Z_0-9]
WEntspricht jedem Nicht-Wort-Zeichen[W] wurde allen Sonderzeichen entsprechen. Abkurzung fur [^w]

Hinweis: Großbuchstaben-Metazeichen (W, D usw.) entsprechen normalerweise dem Gegenteil von was die Kleinbuchstaben-Metazeichen tun (w, d usw.).

Quantifizierer

QuantifiziererBeschreibungBeispiel
+Einer oder mehrere der vorhergehenden Zeichend+ wurde zwei oder mehr Ziffern entsprechen
*Null oder mehr des vorhergehenden Zeichens.* wurde jedem Zeichen 0 oder öfter entsprechen
Hinweis: Technisch gesehen wurde eine leere Zeichenfolge diese Regex erfullen!
?Null oder eine der vorangehendes Zeichena?.* wurde mit a, any, hallo, world
{number}Entspricht dem vorhergehenden Zeichen genau Anzahl d{3} entspricht genau drei Ziffern [0-9]
{num1,num2}Entspricht dem vorhergehenden Zeichen in einem Zahlenbereichd{3,5} entspricht 3 bis 5 Ziffern, die [0-9] sind

Verwenden Sie die Quantoren, Metazeichen und andere Matcher als Bausteine ​​fur Ihre regulären Ausdrucke. Die hier erwähnte Syntax ist in mehreren Sprachen ähnlich, die reguläre Ausdrucke verwenden.

Es gibt jedoch einige Dinge, die beispielsweise in Ruby oder JavaScript verwendet werden und die nicht auf Python ubertragbar wären.

Lassen Sie uns ein wenig lernen mehr daruber, wie reguläre Ausdrucke in Python funktionieren, im nächsten Abschnitt.

Wie funktionieren reguläre Ausdrucke in Python?

Um reguläre Ausdrucke in Python zu verwenden, importieren Sie die re Modul oben in Ihre Datei.

So einfach ist das! Sie mussen nichts Besonderes hinzufugen oder Pakete herunterladen. Es ist bereits integriert, solange Sie es importieren.

Der Spaß besteht darin, die verschiedenen Methoden zu verwenden, die uns im re-Modul zur Verfugung stehen.

re.search(regex, str, flags=0)

Verwenden Sie die Suchfunktion, wenn Sie ein Regex-Muster auf eine Zeichenfolge anwenden möchten, um zu sehen, ob das Muster in der Zeichenfolge enthalten. Diese Methode nimmt ein Muster eines regulären Ausdrucks und gleicht es an einer beliebigen Stelle im String ab.

Wenn das Regex-Muster NICHT im String enthalten ist, gibt der Interpreter None zuruck. Bei einer Übereinstimmung wird ein Match-Objekt zuruckgegeben, das einige Informationen daruber enthält.

Das Match-Objekt hat eine Eigenschaft und zwei Methoden, die verwendet werden können, um Informationen uber die Übereinstimmung abzurufen:

match_obj.span() eine Methode, die ein Tupel zuruckgibt, das die Start- und Endpositionen der Übereinstimmung enthält (das Ende Position ist inklusive).

match_obj.string eine Eigenschaft, die den an die Funktion ubergebenen String zuruckgibt.

match_obj.group() eine Methode, die den Teil des Strings zuruckgibt, bei dem es eine √úbereinstimmung gab.

match_obj wird hier durch die Variable ersetzt, die Sie dem Ergebnis Ihrer re . zuweisen .search()-Methode. Hier ist ein Beispiel fur jede Methode und Eigenschaft:

Die Hauptsache hier ist, dass die Match-Objekt in Python hat Methoden und properties.

Wir verwenden die Eigenschaftszeichenfolge, um auf die ursprungliche Zeichenfolge zuzugreifen, mit der wir die Regex getestet haben, die span-Methode, um auf die Indizes zuzugreifen, und die Gruppenmethode, um das tatsächliche ubereinstimmende Ergebnis zu erhalten. < br>

Es gibt andere Methoden und Eigenschaften, auf die in der Python-Dokumentation verwiesen werden kann, aber diese sind fur den Einstieg gut.

Optionale Argumente: flags

Es gibt ein optionales Argument, das Sie auch mit der Suchmethode des Moduls re verwenden können. Um es zu verwenden, weisen Sie den Parameter flags einer Liste der Flags zu, die Sie verwenden möchten. Der Standardwert ist 0. Einige der beliebtesten Optionen sind:

  • re.DEBUG

Dieses Flag zeigt Debug-Informationen an uber die kompilierte Regex, falls erforderlich.

  • re.I
    re.IGNORECASE

Abgleich ohne Berucksichtigung der Groß-/Kleinschreibung. Dadurch wird die Groß-/Kleinschreibung der an Sätze oder Literalzeichen ubergebenen Zeichen ignoriert, sodass sowohl Groß- als auch Kleinbuchstaben ubereinstimmen.

  • re.M
    re.MULTILINE

Mehrzeilenmodus. Ermöglicht die Verwendung von Regex-Metazeichen fur Zeilenanfang und Zeilenende in mehrzeiligen Strings. Andernfalls wurde es nur am Anfang und am Ende der Zeichenfolge suchen. Ohne das mehrzeilige Flag betrachtet die Regex-Engine den String als eine Zeile.

  • re.S
    re.DOTALL

Dieses Flag sagt die Regex-Engine, dass das Punktzeichen mit jedem Zeichen ubereinstimmt. Standardmäßig entspricht das Punktzeichen jedem Zeichen außer einem Zeilenumbruch.

  • re.X
    re.VERBOSE

Mit dem Verbose-Flag können Sie Kommentare zu Ihrem regulären Ausdruck hinzufugen, um Ihren Ausdruck aufzuschlusseln und seinen Zweck zu kommentieren. Dies kann sehr hilfreich sein, wenn Sie Regex in Python lernen.

Dieses Code-Snippet verwendet das obige Beispiel und enthält einige der oben aufgefuhrten Flags. Wenn Sie mehr als ein Flag verwenden, verwenden Sie den bitweisen | Operator dazwischen als Trennzeichen.

Nehmen Sie sich die Zeit, um zu bemerken, wie uns die Flags beim Testen unseres Strings helfen. Versuchen Sie, den Flags-Parameter herauszunehmen. Gibt der String ein Ergebnis zuruck? Wenn nicht, was gibt es als Ergebnis zuruck?

Denken Sie daran, dass die Suchmethode des re-Moduls die Regex, die zu durchsuchende Zeichenfolge und einen optionalen Flags-Parameter akzeptiert. Ein true-Wert gibt ein Match-Objekt zuruck, dem Eigenschaften und Methoden zugeordnet sind. Ein falscher Wert gibt ein NoneType-Objekt zuruck.

re.match(regex, str, flags=0)

Verwenden Sie die match-Methode, wenn Sie ein Regex-Muster mit dem Anfang des Strings abgleichen möchten. Wenn Sie das Regex-Muster an einer beliebigen Stelle in der Zeichenfolge abgleichen möchten, verwenden Sie stattdessen die obige Suchmethode.

Wenn Sie sich diesen Code in einem Python-Interpreter ansehen, werden Sie feststellen, dass die erste Methode, match(), gibt kein Match-Objekt zuruck, sondern None. Die zweite ermöglicht das Durchsuchen des Strings und gibt ein Match-Objekt zuruck. Dies liegt daran, dass die Methode match() nur den Anfang eines Strings betrachtet, auch wenn das Flag re.MULTILINE gesetzt ist.

re.sub(findRegex, replaceWith, str, count=0, flags=0)

Die Methode sub() im Modul re nimmt einen regex, findet die am weitesten links stehende √úbereinstimmung in einer Zeichenfolge und ersetzt sie durch etwas anderes. Es wiederholt den gleichen Vorgang so oft, wie im Parameter count angegeben. Wenn kein count-Parameter vorhanden ist oder er auf null gesetzt ist, werden alle Vorkommen ersetzt.

Zu Beginn dieses Artikels haben wir uber die Neuformatierung einer Telefonnummer gesprochen. Sehen wir uns hier an, wie das geht:

Dies nimmt unsere Telefonzeichenfolge und findet alle Vorkommen von Leerzeichen und ersetzt es durch einen Bindestrich. In diesem Fall erhalten wir 555-555-5555.

Versuchen wir es mit einer schwierigeren Neuformatierung:

In In diesem Beispiel gehen wir zum Anfang der Zeile, um eine offene Klammer hinzuzufugen und weisen diese neue Zeichenfolge einer Variablen zu.

Wir nehmen dann diese neu zugewiesene Variable (left_parens ) und verwenden Sie es, um die gleiche Operation auszufuhren, um das nächste verfugbare Leerzeichen zu finden, um es durch eine geschlossene Klammer zu ersetzen. Dies wird right_parens zugewiesen.

Schließlich nehmen wir die Variable right_parens und verwenden sie, um die gleiche Operation mit dem letzten Leerzeichen zu ersetzen Sie es durch einen Bindestrich.

Dadurch erhalten wir (555)555-5555.

Zur Zusammenfassung: der sub ()-Methode nimmt ein Regex-Muster, eine Ersatzzeichenfolge oder -funktion, die tatsächliche Zeichenfolge, fur die sub() ausgefuhrt werden soll, und eine Zählung auf. Wenn wir keine Zählung bereitstellen, fuhrt es die Ersetzungen in allen Fällen durch. Es gibt den neuen String mit den durchgefuhrten Ersetzungen zuruck.

Schlussfolgerung

Reguläre Ausdrucke sind eine Möglichkeit, Daten zu validieren oder Zeichen in unseren Strings zu suchen und zu ersetzen. Regex besteht aus Metazeichen, Quantifizierern und Literalzeichen, die verwendet werden können, um unsere Strings zu testen, um zu sehen, ob sie einen Validierungstest bestehen, oder um Übereinstimmungen zu suchen und zu ersetzen.

Regex kann ein wenig sein zunächst uberwältigend, aber wenn man es einmal verstanden hat, ist es ein bisschen wie Fahrradfahren. Es wird Ihnen im Gedächtnis bleiben und Sie können es ganz einfach wieder abrufen.

Wenn Sie das Gefuhl haben, den Inhalt dieses Artikels im Griff zu haben, werfen Sie einen Blick in die Python-Dokumentation um zu sehen, was mit regulären Ausdrucken noch gemacht werden kann. Sehen Sie sich auf jeden Fall die Methoden zum Kompilieren und Aufteilen an.

Viel Spaß beim Regexieren!