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


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

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.


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.

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

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

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

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.")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.