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.

Code: Alles auswählen

line="\test\"
re.search("\\(\w+)\\",line)
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:

Code: Alles auswählen

line="\test\"
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.

Code: Alles auswählen

line = "\\test\\"
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.

Code: Alles auswählen

re.search("\\\\(\\w+)\\\\", line)
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:

Code: Alles auswählen

re.search(r"\\(\w+)\\", line)

Wenn es nicht komplizierter wird reicht hier übrigens ein

Code: Alles auswählen

line.split('\\')[1]

Re: Regex Frage

Verfasst: Mittwoch 1. August 2012, 12:14
von Barcellona
Scheint zu funktionieren, danke!