Seite 1 von 1
Regex Frage
Verfasst: Mittwoch 1. August 2012, 11:56
von Barcellona
Hallo zusammen,
hab' eine Frage zu den regulären Ausdrücken.
Und zwar möchte ich nach dem Schrägstrich \ suchen. Der wird aber ja auch als Metacharakter gebraucht, was mir gerade
Probleme bereitet.
Wie kann ich denn suchen nach dem, was zwischen den Schrägstrichen steht?
Bzw. den Schrägstrich in die Regex einbauen?
Re: Regex Frage
Verfasst: Mittwoch 1. August 2012, 12:03
von lunar
Code: Alles auswählen
>>> s = '\\test\\'
>>> print(s)
\test\
>>> re.findall(r'\\(\w+)\\', s)
['test']
Beachte das "r" vor dem regulären Ausdruck. Damit wird ein sogenannter "raw string" eingeleitet. Im folgenden Zeichenkettenliteral werden normale Escape-Sequenzen nicht mehr ausgewertet, so dass "\\" in zwei Zeichen resultiert, und nicht nur in einem "\\", wie es bei normalen Literalen der Fall ist.
Bei regulären Ausdrücken solltest Du
immer diese Art von Zeichenkette verwenden. Du hast in Deinem Muster nur Glück, dass "\w" keine gültige Escape-Sequenz ist, und daher auch als "\w" im Muster erscheint.
Re: Regex Frage
Verfasst: Mittwoch 1. August 2012, 12:12
von /me
Barcellona hat geschrieben:
Dein Problem ist zuerst einmal die Definition des Strings. Wenn du den obigen Code ausprobiert hättest, dann wüsstest du, dass das so nicht geht. Ein Backslash in einem String ist ein Escape-Zeichen. \t steht beispielsweise für einen Tabulator. Ein Backslash selber muss mit einem Backslash escaped werden.
Bei dem regulären Ausdruck wird es richtig fies. Ein Backslash in einem regulären Ausdruck benötigt ebenfalls einen Backslash als Escape-Zeichen. Da der Backslash
jetzt aber über eine Python-Zeichenkette kommt muss er noch einmal escaped werden. das führt dann zu Folgendem.
Dem kann man üblicherweise mit der Verwendung von Raw-Strings abhelfen. Dabei ist allerdings zu beachten, dass ein einzelner Backslash nicht das letzte Zeichen des Strings sein darf.
Code: Alles auswählen
>>> line= r"\test\"
SyntaxError: EOL while scanning string literal
>>> line= r"\test\ "
>>>
Der reguläre Ausdruck sähe dann so aus:
Wenn es nicht komplizierter wird reicht hier übrigens ein
Re: Regex Frage
Verfasst: Mittwoch 1. August 2012, 12:14
von Barcellona
Scheint zu funktionieren, danke!