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\" :\\
.
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\" :\\
.
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.
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 :
\
ainsi que le(s) personnage(s) que vous recherchez. Vous allez utiliser \
pour échapper à vos personnages, vous devez donc échapper à que également.([\"])
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).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.\
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.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" :\\'
Cela ne fonctionne pas si la chaîne est unicode, parce que vous aurez u et devriez exécuter repr(x)[2:-1]
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\" :\\
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.
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
Duplicata possible de Échapper une chaîne regex en Python
0 votes
À l'origine, la question ne mentionnait pas les expressions régulières, mais cela n'a été ajouté que lors d'une modification trois ans plus tard. Puisque nous disposons déjà d'un bon canonique pour l'échappement des chaînes regex, j'ai ramené la question à son sens original puisque la majorité des réponses ne sont pas non plus en réponse à ce cas particulier.