149 votes

Caractères spéciaux d'échappement Python pour les regex

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

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

4 votes

Qu'est-ce que vous considérez comme un caractère spécial ?

1 votes

Cela dépend complètement de votre contexte. En général, ces caractères sont tout à fait corrects lorsqu'ils se trouvent dans une chaîne de caractères.

0 votes

227voto

pyfunc Points 31088

Utilisez re.escape

re.escape(string)
>>> re.escape('\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'

Voir : http://docs.python.org/library/re.html#module-contents

Je le répète ici :

re.escape(string)

Retourne une chaîne de caractères avec tous les caractères non alphanumériques mis en retrait ; 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.

2 votes

Vous pouvez utiliser le module regex au lieu de re. Un exemple serait regex.escape(pattern,string,special_only=True

21voto

APDent Points 446

Je suis surpris que personne n'ait mentionné l'utilisation des 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\"

Des choses importantes à noter :

  • Dans le recherche comprennent \ ainsi que le(s) personnage(s) que vous recherchez. Vous allez utiliser \ pour échapper à vos personnages, vous devez donc échapper à que également.
  • Mettez des parenthèses autour du recherche modèle, par exemple ([\"]) de sorte que le substitution peut utiliser le caractère trouvé lorsqu'il ajoute \ en face d'elle. (C'est ce que \1 fait : utilise la valeur du premier groupe entre parenthèses).
  • Le site r devant r'([\"])' signifie qu'il s'agit d'un chaîne brute . Les chaînes brutes utilisent différentes différentes pour l'échappement des antislashes. Pour écrire ([\"]) comme une simple chaîne de caractères, vous devez doubler tous les antislashs et écrire '([\\"])' . Les chaînes brutes sont plus conviviales lorsque vous écrivez des expressions régulières.
  • Dans le substitution vous devez échapper \ pour le distinguer d'une qui précède un groupe de substitution, par ex. \1 et donc r'\\\1' . Pour écrire que comme une simple chaîne de caractères, vous aurez besoin de '\\\\\\1' - et personne ne veut ça.

9voto

dp_ Points 92

Utilisez repr()[1:-1]. Dans ce cas, les guillemets doubles n'ont pas besoin d'être échappés. La tranche [-1:1] permet de supprimer les guillemets simples 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 c'est le cas, faites ceci :

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

3 votes

Cela ne fonctionne pas si la chaîne est unicode, parce que vous aurez u et devriez exécuter repr(x)[2:-1]

0 votes

Dans python3.4, où toutes les chaînes de caractères sont unicode, cela ne semble pas fonctionner du tout, malheureusement. A la place, print(repr("I'm stuck")[1:-1]) imprime I'm stuck .

3voto

spatar Points 174

Comme il a été dit plus haut, la réponse dépend de votre cas. Si vous voulez échapper une chaîne de caractères pour un regexp, vous devez utiliser re.escape(). Mais si vous voulez é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\" :\\

0voto

poke Points 64398

Ce n'est pas si difficile :

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

4 votes

Si la barre oblique inversée est l'un des éléments characters il vaudrait mieux que ce soit le premier !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X