Ich stoße auf verwirrende und scheinbar widersprüchliche Regeln in Bezug auf rohe Strings. Betrachten Sie das folgende Beispiel:Raw Strings, Python und re, Normal vs Sonderzeichen
>>> text = 'm\n' >>> match = re.search('m\n', text) >>> print match.group() m >>> print text m
Dies funktioniert, was in Ordnung ist.
>>> text = 'm\n' >>> match = re.search(r'm\n', text) >>> print match.group() m >>> print text m
Auch dies funktioniert. Aber sollte das nicht einen Fehler verursachen, weil die rohe Zeichenkette die Zeichen m\n
enthält und der tatsächliche Text eine neue Zeile enthält?
>>> text = r'm\n'
>>> match = re.search(r'm\n', text)
>>> print match.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> print text
m\n
Die oben genannten, wirft überraschenderweise einen Fehler, obwohl beide rohe Zeichenfolgen sind. Dies bedeutet, dass beide nur den Text m\n
ohne Zeilenumbrüche enthalten.
>>> text = r'm\n'
>>> match = re.search(r'm\\n', text)
>>> print text
m\n
>>> print match.group()
m\n
Das obige funktioniert, überraschend. Warum muss ich den Backslash in der re.search umgehen, aber nicht im Text selbst?
Dann gibt es Backslash mit normalen Zeichen, die kein spezielles Verhalten haben:
>>> text = 'm\&'
>>> match = re.search('m\&', text)
>>> print text
m\&
>>> print match.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
Dies passt nicht, obwohl sowohl das Muster und die Zeichenfolge fehlt Sonderzeichen.
In diesem Fall funktioniert keine Kombination von Raw-Zeichenfolgen (Text als Raw-Zeichenfolge, Muster als Raw-Zeichenfolge, beide oder keine).
Betrachten Sie jedoch das letzte Beispiel. Das Escapen in der Textvariablen 'm\\&'
funktioniert nicht, aber das Entkommen im Muster funktioniert. Dies ist eine Parallele das Verhalten oben - noch seltsamer, fühle ich mich, wenn man bedenkt, dass \&
keine besondere Bedeutung ist entweder Python oder re:
>>> text = 'm\&'
>>> match = re.search(r'm\\&', text)
>>> print text
m\&
>>> print match.group()
m\&
Mein Verständnis von rohen Strings ist, dass sie das Verhalten des umgekehrten Schrägstrich in Python hemmen . Für reguläre Ausdrücke ist dies wichtig, da re.search sein eigenes internes Backslash-Verhalten anwenden und Konflikte mit Python vermeiden kann. In Situationen wie dem oben genannten, in denen Backslash effektiv nichts bedeutet, bin ich mir nicht sicher, warum dies notwendig erscheint. Schlimmer noch, ich verstehe nicht, warum ich Backslash für das Muster brauche, aber nicht den Text, und wenn ich beide eine rohe Zeichenfolge mache, scheint es nicht zu funktionieren.
The docs bieten nicht viel Anleitung in dieser Hinsicht. Sie konzentrieren sich auf Beispiele mit offensichtlichen Problemen, wie '\section'
, wobei \s
ein Meta-Zeichen ist. Auf der Suche nach einer vollständigen Antwort, um unvorhergesehenes Verhalten wie dieses zu verhindern.
Es gibt nichts zu überraschen. 'r'm \ n 'hat die Länge 3 (' m', '' '' '' '' '' '' '' '' '' '} Der 'r'm \ n'' Regex entspricht 2 Zeichenketten,' m' + Newline. –
Das macht Ihre Frage zu einem Betrogenen von http://StackOverflow.com/Questions/22937618/Reference-What-Does-this-regex-mean. Das 'r '\ n'' ist ein LF-passendes Muster. –