如何使用单个反斜杠转义字符串的特殊字符

Tom*_*Tom 37 python escaping nginx

我试图-]\^$*.用一个反斜杠来逃避每个角色\.

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

\^stack\.\*/overflo\\w\$arr=1
Run Code Online (Sandbox Code Playgroud)

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

re.escape 双逃脱不是我想要的:

'\\^stack\\.\\*\\/overflow\\$arr\\=1'
Run Code Online (Sandbox Code Playgroud)

我需要这个以逃避其他东西(nginx).

rlm*_*lms 84

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

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

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

import re
escaped = re.escape(a_string)
Run Code Online (Sandbox Code Playgroud)

  • 应该提一下,maketrans是在python 3中,而不是python 2.x. (2认同)
  • `maketrans()`仍在Python 2中。它在字符串模块中,而不在str对象中:https://docs.python.org/2/library/string.html#string.maketrans (2认同)

Ry-*_*Ry- 12

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

  • @Air:我会在某些时候研究确切的不兼容性,但问题的作者认为它不起作用,因为它双重逃脱,但那是因为他们在REPL中使用它,那是`repr()`.它实际上并没有这样做,并且在给定的示例中可以在Nginx中工作. (3认同)

Sag*_*ran 10

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

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

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

  • 执行 `fr'{my_string}'` **不会更改字符串内容**。它等价于 `f'{my_string}'` (因为 `r` 仅在解释*字符串文字*时适用,并且 `{`、`m`、`y`、`_` 都不适用, `s`、`t`、`r`、`i`、`n`、`g`、`}` 需要转义),相当于 `str(my_string)` (因为这就是 f 字符串将要执行的内容)最终做了),这相当于“my_string”(因为它已经是一个字符串)。这并不能解决问题,因为它需要*创建“my_string”的代码已经解决了问题*。 (4认同)

rjm*_*nro 6

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
>>>
Run Code Online (Sandbox Code Playgroud)


Aks*_*ari 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
Run Code Online (Sandbox Code Playgroud)