Regex Frage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

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?
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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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]
Zuletzt geändert von /me am Mittwoch 1. August 2012, 12:15, insgesamt 1-mal geändert.
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Scheint zu funktionieren, danke!
Antworten