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

126

Python a-t-il une fonction que je peux utiliser pour échapper des caractères spéciaux dans une expression régulière?

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

Wolfy
la source
2
Que considérez-vous comme un personnage spécial?
pafcu
1
Dépend complètement de votre contexte. Habituellement, ces caractères sont parfaitement adaptés lorsque vous les avez dans une chaîne.
poke
duplication possible de la chaîne de regex d'échappement en Python
Jukka Suomela

Réponses:

197

Utilisation 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

Répétez-le ici:

re.escape (chaîne)

Chaîne de retour avec tous les non-alphanumériques antislashés; ceci est utile si vous voulez faire correspondre une chaîne littérale arbitraire qui peut contenir des métacaractères d'expression régulière.

Depuis Python 3.7 a re.escape()été modifié pour n'échapper que les caractères significatifs pour les opérations regex.

pyfunc
la source
1
Vous pouvez utiliser le module regex au lieu de re. Un exemple serait regex.escape(pattern,string,special_only=True
Lokinou
17

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 de recherche , incluez \ainsi que le ou les caractères que vous recherchez. Vous allez utiliser \pour échapper à vos personnages, vous devez échapper que aussi bien.
  • Mettez des parenthèses autour du modèle de recherche , par exemple ([\"]), afin que le modèle de substitution puisse utiliser le caractère trouvé quand il ajoute \devant lui. (C'est ce que \1fait: utilise la valeur du premier groupe entre parenthèses.)
  • Le rdevant r'([\"])'signifie que c'est une chaîne brute . Les chaînes brutes utilisent des règles différentes pour échapper les contre-obliques. 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 la substitution modèle, vous devez échapper \à la distinguer d'une barre oblique inverse qui précède un groupe de substitution, par exemple \1, par conséquent r'\\\1'. Pour écrire cela sous forme de chaîne simple, vous auriez besoin '\\\\\\1'- et personne ne le veut.
Tim Ruddick
la source
9

Utilisez repr () [1: -1]. Dans ce cas, les guillemets doubles n'ont pas besoin d'être échappés. La tranche [-1: 1] consiste à supprimer le guillemet 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 tel est le cas, procédez comme suit:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
dp_
la source
3
Cela ne fonctionne pas si la chaîne est unicode, car vous aurez u et devriez exécuterrepr(x)[2:-1]
Antoine Pelisse
En python3.4, où toutes les chaînes sont en Unicode, cela ne semble pas du tout fonctionner, malheureusement. Au lieu de cela, print(repr("I'm stuck")[1:-1])imprime I'm stuck.
dantiston
3

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 souhaitez échapper un ensemble spécifique de caractères, 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\" :\\
spatier
la source
1

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\" :\
poussée
la source
3
Si le backslash est l'un des, charactersil vaut mieux être le premier!
steveha
0

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

import re

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