Escape-Regex-Sonderzeichen in einer Python-Zeichenfolge

126

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\" :\\.

Wolfy
quelle
2
Was ist für Sie ein besonderer Charakter?
Pafcu
1
Kommt ganz auf deinen Kontext an. Normalerweise sind diese Zeichen völlig in Ordnung, wenn Sie sie in einer Zeichenfolge haben.
Poke
Mögliches Duplikat der Escaping-Regex-Zeichenfolge in Python
Jukka Suomela

Antworten:

196

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.

pyfunc
quelle
1
Sie können das Regex-Modul anstelle von Re verwenden. Ein Beispiel wäre regex.escape(pattern,string,special_only=True
Lokinou
17

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:

  • Im Suchmuster enthalten \sowie die Stelle (n) Sie suchen. Sie gehen zu verwenden \Ihre Charaktere zu entkommen, so dass Sie entkommen müssen , dass auch.
  • Setzen Sie z. B. Klammern um das Suchmuster([\"]) , damit das Substitutionsmuster das gefundene Zeichen verwenden kann, wenn es \davor hinzugefügt wird. (Das \1bedeutet: Verwendet den Wert der ersten Gruppe in Klammern.)
  • Das rvor 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.
  • Im Substitutionsmuster, müssen Sie entkommen \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.
Tim Ruddick
quelle
9

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" :\\'
dp_
quelle
3
Das funktioniert nicht, wenn der String Unicode ist, weil Sie u haben und laufen solltenrepr(x)[2:-1]
Antoine Pelisse
In Python3.4, wo alle Zeichenfolgen Unicode sind, scheint dies leider überhaupt nicht zu funktionieren. Stattdessen print(repr("I'm stuck")[1:-1])druckt I'm stuck.
Dantiston
3

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\" :\\
Spatar
quelle
1

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\" :\
Sack
quelle
3
Wenn Backslash einer der Gründe ist, sollte characterses besser der erste sein!
Steveha
0

Wenn Sie nur einige Zeichen ersetzen möchten, können Sie Folgendes verwenden:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
Christoph Roeder
quelle