Der Bindestrich innerhalb von Zeichensätzen in Python Regex
Der Bindestrich ist auch ein Sonderzeichen innerhalb von [ ]
(außerhalb jedoch nicht). Wenn Sie den Bindestrich selbst
als Symbol benötigen - dann setzen Sie ihn dorthin,
wo er nicht als Trennzeichen einer Gruppe
interpretiert wird.
Warum das wichtig ist: Sie können eine Zeichengruppe
erstellen, ohne es zu merken. Zum Beispiel
so - '[:-@]' - Sie denken, Sie wählen
Doppelpunkt, Bindestrich und At-Zeichen aus, aber
in Wirklichkeit ergibt sich eine Zeichengruppe zwischen
: und @. Zu dieser Gruppe gehören
folgende Zeichen: ? < = > :
Woher kommen sie? Aus der ASCII-Tabelle - der Doppelpunkt hat eine niedrigere Nummer als das At-Zeichen - und so ergibt sich eine Gruppe. Das heißt, alle Gruppen ergeben sich gemäß der ASCII-Tabelle (bei Bedarf kann man dies nutzen).
Wie man damit umgeht: Setzen Sie das Symbol
Bindestrich dorthin, wo er definitiv nicht als Gruppensymbol
interpretiert wird, zum Beispiel an den Anfang oder
ans Ende (also nach [ oder vor
]).
Man kann den Bindestrich auch maskieren - dann
wird er unabhängig von der Position
sich selbst bedeuten. Zum Beispiel, anstelle von [:-@]
[:\-@] schreiben - und es gibt keine Gruppe
mehr, sondern drei Zeichen - Doppelpunkt,
Bindestrich und At-Zeichen @.
Beispiel
Im folgenden Beispiel ist das Suchmuster wie folgt:
Ziffer 1, dann Buchstabe von 'a'
bis 'z', dann Ziffer 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! 1-2 ! !'
Beispiel
Lassen Sie uns nun den Bindestrich maskieren.
Das Suchmuster ist nun: Ziffer
1, dann Buchstabe 'a', oder
Bindestrich, oder Buchstabe 'z', dann Ziffer
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! ! 1c2 !'
Beispiel
Man kann den Bindestrich einfach umstellen, ohne ihn zu maskieren:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! ! 1c2 !'
Beispiel
Im folgenden Beispiel ist das Suchmuster wie folgt:
das erste Zeichen ist ein Kleinbuchstabe oder
ein Bindestrich '-', dann zwei Buchstaben
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! Axx ! @xx'
Beispiel
Im folgenden Beispiel ist das Suchmuster wie folgt:
das erste Zeichen ist ein Kleinbuchstabe, Großbuchstabe
oder Bindestrich '-', dann zwei Buchstaben
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! ! ! @xx'
Beispiel
Man kann den Bindestrich zwischen zwei Gruppen platzieren - dort wird er definitiv keine weitere Gruppe erstellen:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! ! ! @xx'
Praktische Aufgaben
Gegeben ist ein String:
txt = 'xaz xBz xcz x-z x@z'
Finden Sie alle Strings nach folgendem Muster:
Buchstabe 'x', Groß- oder Kleinbuchstabe
oder Bindestrich, Buchstabe 'z'.
Gegeben ist ein String:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Finden Sie alle Strings nach folgendem Muster:
Buchstabe 'x', dann entweder Dollar,
Bindestrich oder Plus, dann Buchstabe 'z'.