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).
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)
Juste en supposant que ceci s’applique à une expression régulière, utilisez re.escape
.
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
>>>
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
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('\\\\', '\\')
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