Как избежать специальных символов строки с одиночными обратными косыми чертами
Я пытаюсь избежать символов -]\^$*.
, каждый с одним обратным слэшем \
.
Например, строка: ^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