Inhaltsverzeichnis

match


Syntax: regex.match(regex,String to check)

Match-Objekt

Einige Methoden geben statt eines String oder einer Liste von Strings ein Match-Object zurück.

Einige interessante Methoden und Attribute:

Methode/AttributBeschreibung
group()

Group gibt den gematchten String einer Gruppe zurück

Beispiel:

import regex
result=regex.match('Peter[a-z]*','Peterson und Dietersen')
result.group()

Wird es wie oben nur group() aufgerufen wird der gesamte gematchte String zurückgegeben → in obigem Beispiel „Peterson“.

Beispiel:

import regex
result=regex.match('(?<Vorname>[A-Za-z]*)(?<Nachname>[A-Za-z]*)','Peter Karlson')
result.group()
result.group("Vorname")
result.group("Nachname")

In obigem Beispiel würde group() „Peter Karlson“ zurückgeben.
group(„Vorname“): Peter
group(„Nachname“): Karlson

start()/end()

Geben die Start- und Endposition der matchenden Gruppe zurück.
Wenn ohne Gruppennamen als Parameter aufgerufen geben sie den Beginn und Endes des matchenden Strings wieder.

Zu beachten ist das end die erste Position nach dem match ist! Ist das match 4 Zeichen lang und beginnt bei 0, ist end 5 → das ist kein Problem wenn man String-Slicing macht, da dies als End-Position ebenfalls das nächste Zeichen hinter dem gewünschten Bereich erwartet.

Syntax:

matchobject.end()
<code>
In obigem Fall würde das Ende des gesamten Matches zurückgegeben.
<code>
matchobject.end("Gruppenname")

In obigem Beispiel wird das Ende von Gruppe „Gruppenname“ im durchsuchten String zurückgegeben.

Gruppen

Benannte Gruppen

Reguläre Ausdrücke können benannte Gruppen enthalten.
In einer benannten Gruppe wird eine Sub-Ausdruck des gesamten regulären Ausdrucks gespeichert, dessen Ergebnis später unter Angabe des Gruppennamen ähnlich wie in einem dictionary zugegriffen werden kann.
Syntax:

(<Gruppenname>Regulärer Ausdruck)
regex.match('(?<number>[0-9]+) (?<unit>kg|Pound)','15 kg')

Das match-Object was das Ergebnis enthält wird daraufhin für den Aufruf:

zurückgeben.

Achtung: Wie bei dictionaries auch kann ein Schlüssel/Gruppenname nur einmal vorkommen. Das bedeutet würde eine Gruppe mehrfach matchen, wird nur das letzte match unter dem Gruppennamen gespeichert.

Probleme

Greediness/es wird zu viel gematcht

Greedy bedeutet, dass der reguläre Ausdruck so viel matcht wie möglich, beginnend links und so weit nach Rechts im zu durchsuchenden String geht bis er scheitert.
Beispiel:

regex.match('\[.*\],'[Text][Text2]')

In obigem Beispiel würde man eventuell als Ergebnis:
„[Text]“
erwarten.

Statt dessen erhält man aber „[Text][Text2]“ als Ergebnis.
Grund ist, dass „*“ greedy ist. Da der Ausdruck „.*“ war bedeutet es, es darf alle Zeichen „verschlingen“, das inkludiert „]“.
Der Regex-Parser prüft natürlich das vorkommen der Zeichen nach dem „.*“ und „merkt“ sich das erste vorkommen von „]“ als mögliche Stoppposition für „.*“, da „.*“ aber greedy ist und später im durchsuchten String noch ein „]“ kommt und das ebenfalls den regulären Ausdruck befriedigt nimmt er das zweite „]“ und stoppt da erst „*“.

regex.match('\[.*?\],'[Text][Text2]')

In obigem Fall ist das Ergebnis „[Text]“.
Grund ist das „?“ hinter „.*“ welches „*“ in seine Non-Greedy/Nicht-Gierige Version ändert.
Der Regex-Parser prüft also ob ein Zeichen nach dem „*“ im regulären Ausdruck im Suchstring gefunden wurde und stoppt beim ersten finden dieses Zeichens die Ausführung von „*“ (in diesem Fall von „.*“).

Empty Match

regex.match() sollte wenn der zu prüfende String nicht mit dem regulären Ausdruck übereinstimmt „None“ zurückgeben.
Es gibt aber Fälle wo es einen leeren String zurückgibt.
Ähnliches kann bei regex.findall passieren, wo man eine Liste erhält die zum Teil oder überhaupt nur leere Felder enthält.

Grund ist, dass im regulären Ausdruck „?“ oder „*“ verwendet wird:

regex.match('\[0-9\]*','Blalaala')

In obigem Beispiel könnte man meinen der reguläre Ausdruck würde nicht matchen, da ja kein Zahlen [0-9] im zu untersuchenden String vorkommen.
Allerdings wurde „*“ angegeben (das gleiche wäre der Fall wenn man + angibt), was auch bedeutet das der vorhergehende Ausdruch ([0-9]) auch 0 mal vorkommen darf.
Das ist hier der Fall und daher stimmen aus Sicht des regex-Parsers der reguläre Ausdruck und der zu untersuchende String überein, die sich überlagernde Teile haben allerdings eine Länge von 0 → folglich ist das Ergebnis ein leerer String.

Vermieden werden kann das, in dem man wenn man eigentlich mindestens 1 erwartet, statt „*“ „+“ nutzt → 1 mal oder öfter der davor stehende Ausdruck.