web-dev-qa-db-fra.com

Échapper aux caractères spéciaux regex dans une chaîne Python

Est-ce que Python a une fonction que je peux utiliser pour échapper aux caractères spéciaux d'une expression régulière?

Par exemple, I'm "stuck" :\ devrait devenir I\'m \"stuck\" :\\.

107
Wolfy

Utilisez 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
_

En le répétant ici:

re.escape (chaîne)

Renvoie une chaîne avec tous les caractères non alphanumériques inversés; Cela est utile si vous souhaitez faire correspondre une chaîne littérale arbitraire pouvant contenir des métacaractères d'expression régulière.

174
pyfunc

Je suis surpris que personne n'ait mentionné l'utilisation d'expressions régulières via 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\"

Points importants à noter:

  • Dans le modèle recherche, incluez \ ainsi que le (s) caractère (s) recherché (s). Vous allez utiliser \ pour échapper à vos personnages. Vous devez donc également échapper à cela .
  • Placez des parenthèses autour du motif recherche, par exemple. ([\"]), de sorte que le modèle substitution puisse utiliser le caractère trouvé lorsqu'il ajoute \ devant celui-ci. (C'est ce que fait \1: utilise la valeur du premier groupe entre parenthèses.)
  • La r devant r'([\"])' signifie qu'il s'agit d'une chaîne brute . Les chaînes brutes utilisent différentes règles pour échapper des barres obliques inverses. Pour écrire ([\"]) sous forme de chaîne simple, vous devez doubler toutes les barres obliques inverses et écrire '([\\"])'. Les chaînes brutes sont plus conviviales lorsque vous écrivez des expressions régulières.
  • Dans le modèle substitution, vous devez échapper à \ pour le distinguer d'une barre oblique inverse précédant un groupe de substitution, par exemple. \1, d'où r'\\\1'. Pour écrire que en tant que chaîne simple, vous auriez besoin de '\\\\\\1' - et personne ne le voudra.
17
Tim Ruddick

Utilisez repr () [1: -1]. Dans ce cas, il n'est pas nécessaire d'échapper aux guillemets. La tranche [-1: 1] consiste à supprimer la citation simple du début et de la fin.

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

Ou peut-être voulez-vous simplement échapper une phrase à coller dans votre programme? Si oui, faites ceci:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
10
dp_

Comme il a été mentionné ci-dessus, la réponse dépend de votre cas. Si vous voulez échapper une chaîne pour une expression régulière, vous devez utiliser re.escape (). Mais si vous voulez échapper à un ensemble de caractères spécifique, utilisez cette fonction lambda:

>>> 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\" :\\
3
spatar

Ce n'est pas si dur:

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\" :\
2
poke

Si vous souhaitez uniquement remplacer certains caractères, vous pouvez utiliser ceci:

import re

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