60

我试图-]\^$*.用一个反斜杠来转义每个字符\

例如字符串:^stack.*/overflo\w$arr=1将变为:

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

在 Python 中最有效的方法是什么?

re.escape双重转义,这不是我想要的:

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

我需要这个来逃避别的东西(nginx)。

4

6 回答 6

137

这是一种方法(在 Python 3.x 中):

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

作为参考,用于转义字符串以在正则表达式中使用:

import re
escaped = re.escape(a_string)
于 2013-09-21T17:56:56.797 回答
20

假设这是一个正则表达式,使用re.escape.

于 2013-09-21T17:57:03.567 回答
13

我们可以使用内置函数repr()或字符串插值fr'{}'转义\Python 3.7 中的所有反斜杠。*

repr('my_string')或者fr'{my_string}'

检查链接:https ://docs.python.org/3/library/functions.html#repr

于 2019-09-06T21:13:35.777 回答
10

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
>>>
于 2016-05-05T11:14:22.850 回答
5

简单地使用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
于 2016-01-08T07:04:16.397 回答
0

利用内置的输出repr来处理\r\n\t和处理re.escape你想要的输出:

re.escape(repr(a)[1:-1]).replace('\\\\', '\\')
于 2016-03-26T11:48:24.247 回答