web-dev-qa-db-fra.com

Comment échapper aux caractères spéciaux d'une chaîne avec des barres obliques inverses simples

J'essaie d'échapper aux personnages -]\^$*. chacun avec une seule barre oblique inversée \.

Par exemple, la chaîne: ^stack.*/overflo\w$arr=1 va devenir:

\^stack\.\*/overflo\\w\$arr=1

Quel est le moyen le plus efficace de faire cela en Python?

re.escape double évasions qui ne sont pas ce que je veux:

'\\^stack\\.\\*\\/overflow\\$arr\\=1'

J'ai besoin de cela pour échapper à autre chose (nginx).

37
Tom

C’est une façon de le faire (dans Python 3.x):

escaped = a_string.translate(str.maketrans({"-":  r"\-",
                                          "]":  r"\]",
                                          "\\": r"\\",
                                          "^":  r"\^",
                                          "$":  r"\$",
                                          "*":  r"\*",
                                          ".":  r"\."}))

Pour référence, pour les chaînes d'échappement à utiliser dans regex:

import re
escaped = re.escape(a_string)
79
rlms

Juste en supposant que ceci s’applique à une expression régulière, utilisez re.escape .

12
Ry-

re.escape ne double pas s'échapper. Il semblerait que ce soit le cas si vous exécutez la répl. La deuxième couche d'échappement est provoquée par la sortie à l'écran.

Lorsque vous utilisez repl, essayez d'utiliser print pour voir ce qui se trouve réellement dans la chaîne.

$ python
>>> import re
>>> re.escape("\^stack\.\*/overflo\\w\$arr=1")
'\\\\\\^stack\\\\\\.\\\\\\*\\/overflo\\\\w\\\\\\$arr\\=1'
>>> print re.escape("\^stack\.\*/overflo\\w\$arr=1")
\\\^stack\\\.\\\*\/overflo\\w\\\$arr\=1
>>>
5
rjmunro

En utilisant simplement re.sub pourrait aussi fonctionner à la place de str.maketrans. Et cela fonctionnerait aussi dans python 2.x

>>> print(re.sub(r'(\-|\]|\^|\$|\*|\.|\\)',lambda m:{'-':'\-',']':'\]','\\':'\\\\','^':'\^','$':'\$','*':'\*','.':'\.'}[m.group()],"^stack.*/overflo\w$arr=1"))
\^stack\.\*/overflo\\w\$arr=1
5
Akshay Hazari

Utiliser le résultat de repr intégré pour traiter \r\n\t et traiter la sortie de re.escape est ce que vous voulez:

re.escape(repr(a)[1:-1]).replace('\\\\', '\\')
2
cyining

Nous pourrions utiliser la fonction intégrée repr() pour échapper à tous les backlashs \ Dans Python 3.7. *

repr('your_string')

Vérifiez le lien: https://docs.python.org/3/library/functions.html#repr

0
Free Sadness