Как экранировать специальные символы строки с помощью одной обратной косой черты

Я пытаюсь экранировать символы -]\^$*. с помощью одной обратной косой черты \.

Например, строка: ^stack.*/overflo\w$arr=1 станет:

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

Какой самый эффективный способ сделать это в Python?

re.escape двойные побеги, а это не то, что мне нужно:

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

Мне нужно это, чтобы сбежать для чего-то другого (nginx).


person Tom    schedule 21.09.2013    source источник


Ответы (6)


Это один из способов сделать это (в Python 3.x):

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

Для справки, для экранирования строк для использования в регулярном выражении:

import re
escaped = re.escape(a_string)
person rlms    schedule 21.09.2013
comment
@hcwhsa string.translate как в a_variable_called_string.translate, а не функция, называемая переводом в строке модуля. - person rlms; 21.09.2013
comment
Следует отметить, что maketrans находится в python 3, а не в python 2.x. - person Ashwini Khare; 23.06.2015
comment
maketrans() все еще находится в Python 2. Он находится в модуле string, а не в объекте str: docs.python.org/2/library/string.html#string.maketrans - person OozeMeister; 13.10.2017
comment
maketrans в python2 ведет себя совсем по-другому, требуя, чтобы входные и выходные строки были одинаковой длины, и он не принимает входные данные словаря. Не очень хорошо делать такие переводы. - person Twirrim; 04.12.2019


Мы могли бы использовать встроенную функцию repr() или интерполяцию строк fr'{}' для экранирования всех обратных косых черт \ в Python 3.7.*

repr('my_string') or fr'{my_string}'

Проверьте ссылку: https://docs.python.org/3/library/functions.html#repr

person Saguoran    schedule 06.09.2019

re.escape не удваивается. Это просто выглядит так, если вы запустите repl. Второй уровень экранирования вызван выводом на экран.

При использовании repl попробуйте использовать print, чтобы увидеть, что на самом деле находится в строке.

$ 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
>>>
person rjmunro    schedule 05.05.2016

Простое использование re.sub также может работать вместо str.maketrans. И это также будет работать в python 2.x

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

Используйте вывод встроенного repr для работы с \r\n\t и обработки вывода re.escape — это то, что вам нужно:

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