Hat Python eine Funktion, mit der ich Sonderzeichen in einem regulären Ausdruck maskieren kann?
Zum Beispiel I'm "stuck" :\
sollte werden I\'m \"stuck\" :\\
.
Hat Python eine Funktion, mit der ich Sonderzeichen in einem regulären Ausdruck maskieren kann?
Zum Beispiel I'm "stuck" :\
sollte werden I\'m \"stuck\" :\\
.
Antworten:
Verwenden re.escape
>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com
Wiederholen Sie es hier:
re.escape (Zeichenfolge)
Rückgabezeichenfolge mit allen nicht alphanumerischen Schrägstrichen; Dies ist nützlich, wenn Sie mit einer beliebigen Literalzeichenfolge übereinstimmen möchten, die möglicherweise Metazeichen mit regulären Ausdrücken enthält.
Ab Python 3.7 re.escape()
wurde geändert, um nur Zeichen zu maskieren, die für Regex-Operationen von Bedeutung sind.
regex.escape(pattern,string,special_only=True
Ich bin überrascht, dass niemand die Verwendung regulärer Ausdrücke über Folgendes erwähnt hat re.sub()
:
import re
print re.sub(r'([\"])', r'\\\1', 'it\'s "this"') # it's \"this\"
print re.sub(r"([\'])", r'\\\1', 'it\'s "this"') # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"') # it\'s\ \"this\"
Wichtige Dinge zu beachten:
\
sowie die Stelle (n) Sie suchen. Sie gehen zu verwenden \
Ihre Charaktere zu entkommen, so dass Sie entkommen müssen
, dass auch.([\"])
, damit das Substitutionsmuster
das gefundene Zeichen verwenden kann, wenn es \
davor hinzugefügt wird. (Das
\1
bedeutet: Verwendet den Wert der ersten Gruppe in Klammern.)r
vor r'([\"])'
bedeutet, dass es eine rohe Saite ist . Raw-Strings verwenden unterschiedliche Regeln, um Backslashes zu vermeiden. Um ([\"])
als einfache Zeichenfolge zu schreiben , müssen Sie alle Backslashes verdoppeln und schreiben '([\\"])'
. Rohe Zeichenfolgen sind freundlicher, wenn Sie reguläre Ausdrücke schreiben.\
es von einem umgekehrten Schrägstrich zu unterscheiden , die eine Substitutionsgruppe vorangeht, zum Beispiel \1
, daher r'\\\1'
. Um das als einfache Zeichenfolge zu schreiben
, müsste man '\\\\\\1'
- und das will niemand.Verwenden Sie repr () [1: -1]. In diesem Fall müssen die doppelten Anführungszeichen nicht maskiert werden. Das Slice [-1: 1] dient zum Entfernen des einfachen Anführungszeichens vom Anfang und vom Ende.
>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\
Oder möchten Sie einfach nur einer Phrase entkommen, um sie in Ihr Programm einzufügen? Wenn ja, machen Sie Folgendes:
>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
druckt I'm stuck
.
Wie oben erwähnt, hängt die Antwort von Ihrem Fall ab. Wenn Sie eine Zeichenfolge für einen regulären Ausdruck maskieren möchten, sollten Sie re.escape () verwenden. Wenn Sie jedoch einem bestimmten Zeichensatz entkommen möchten, verwenden Sie diese Lambda-Funktion:
>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\
Es ist nicht so schwer:
def escapeSpecialCharacters ( text, characters ):
for character in characters:
text = text.replace( character, '\\' + character )
return text
>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\
characters
es besser der erste sein!
Wenn Sie nur einige Zeichen ersetzen möchten, können Sie Folgendes verwenden:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")