Как избежать специальных символов строки с одиночными обратными косыми чертами

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

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

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

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

re.escape двойные escape-последовательности, которые не то, что я хочу:

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

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

Ответы

Ответ 1

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

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

Для справки: для экранирования строк в regex:

import re
escaped = re.escape(a_string)

Ответ 2

Предполагая, что это для регулярного выражения, используйте re.escape.

Ответ 3

Просто использование 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

Ответ 4

re.escape не удваивает 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
>>>

Ответ 5

Использовать вывод встроенного repr для работы с \r\n\t и обрабатывать вывод re.escape - это то, что вы хотите:

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

Ответ 6

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

repr('my_string') или fr'{my_string}'

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