Maskierung von Sonderzeichen in Python-Regex
Angenommen, wir möchten, dass ein Sonderzeichen sich selbst darstellt. Dazu muss es mit einem Backslash maskiert werden. Schauen wir uns einige Beispiele an.
Beispiel
Im folgenden Beispiel wollte der Autor des regulären Ausdrucks,
dass das Suchmuster so aussieht: Buchstabe
'a', dann Plus '+', dann
Buchstabe 'x'. Allerdings hat der Code-Autor
das Symbol '+' nicht maskiert, und deshalb
sieht das Suchmuster in Wirklichkeit so aus:
Buchstabe 'a' ein- oder mehrmals,
dann Buchstabe 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Ergebnis der Codeausführung:
'a+x ! ! !'
Beispiel
Jetzt hat der Autor das Plus mit einem Backslash
maskiert. Nun sieht das Suchmuster so aus,
wie es soll: Buchstabe 'a', dann Plus
'+', dann Buchstabe 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! ax aax aaax'
Beispiel
In diesem Beispiel sieht das Muster so aus:
Buchstabe 'a', dann Punkt '.',
dann Buchstabe 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! abx azx'
Beispiel
Im nächsten Beispiel hat der Autor vergessen, den Punkt zu maskieren, und es wurden alle Teilzeichenketten erfasst, da ein nicht maskierter Punkt für ein beliebiges Zeichen steht:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Ergebnis der Codeausführung:
'! ! !'
Hinweis
Beachten Sie, dass man es möglicherweise nicht bemerkt, wenn man den Backslash für den Punkt vergisst (wenn er sich selbst darstellen soll):
res = re.sub('a.x', '!', 'a.x')
print(res) # gibt '!' zurück, wie gewünscht
Visuell funktioniert es korrekt (da der Punkt
für ein beliebiges Zeichen steht, einschließlich eines
normalen Punktes '.'). Aber wenn wir
die Zeichenkette ändern, in der die Ersetzungen stattfinden -
sehen wir unseren Fehler:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # gibt '! ! !' zurück, erwartet wurde '! abx azx'
Liste der Sonderzeichen und gewöhnlichen Zeichen
Wenn man ein gewöhnliches Zeichen maskiert - passiert nichts Schlimmes - es wird weiterhin sich selbst darstellen. Eine Ausnahme sind Ziffern, diese können nicht maskiert werden.
Oft besteht Unsicherheit, ob ein bestimmtes Zeichen ein Sonderzeichen ist. Manche neigen dazu, alle verdächtigen Zeichen wahllos zu maskieren. Dies ist jedoch eine schlechte Praxis (verschmutzt den regulären Ausdruck mit Backslashes).
Sonderzeichen sind: $ ^ . * + ? \ / {} [] () |
Keine Sonderzeichen sind: @ : , ' " - _ = < > % # ~ `& !
Praktische Aufgaben
Gegeben ist die Zeichenkette:
txt = 'a.a aba aea'
Schreiben Sie einen regulären Ausdruck, der die Zeichenkette
'a.a' findet, ohne die anderen zu erfassen.
Gegeben ist die Zeichenkette:
txt = '2+3 223 2223'
Schreiben Sie einen regulären Ausdruck, der die Zeichenkette
'2+3' findet, ohne die anderen zu erfassen.
Gegeben ist die Zeichenkette:
txt = '23 2+3 2++3 2+++3 345 567'
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
'2+3', '2++3', '2+++3',
findet, ohne die anderen zu erfassen (+ kann beliebig oft
vorkommen).
Gegeben ist die Zeichenkette:
txt = '23 2+3 2++3 2+++3 445 677'
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
'23', '2+3', '2++3',
'2+++3' findet, ohne die anderen zu erfassen.
Gegeben ist die Zeichenkette:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
'*q+', '*qq+', '*qqq+',
findet, ohne die anderen zu erfassen.
Gegeben ist die Zeichenkette:
txt = '[abc] {abc} abc (abc) [abc]'
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
in eckigen Klammern findet und sie durch
'!' ersetzt.