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

Posted

技术标签:

【中文标题】如何使用单个反斜杠转义字符串的特殊字符【英文标题】:How to escape special characters of a string with single backslashes 【发布时间】:2013-09-26 23:05:53 【问题描述】:

我正在尝试使用单个反斜杠 \ 来转义字符 -]\^$*.

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

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

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

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

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

我需要这个来逃避其他事情(nginx)。

【问题讨论】:

【参考方案1】:

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

repr('my_string')fr'my_string'

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

【讨论】:

【参考方案2】:

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
>>>

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

简单地使用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

【讨论】:

【参考方案5】:

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

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

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

import re
escaped = re.escape(a_string)

【讨论】:

@hcwhsa string.translatea_variable_called_string.translate 一样,而不是模块字符串中调用 translate 的函数。 应该提一下,maketrans 是在 python 3 中,而不是 python 2.x maketrans() 仍在 Python 2 中。它在字符串模块中,而不是 str 对象中:docs.python.org/2/library/string.html#string.maketrans maketrans 在 python2 中的行为非常不同,要求输入和输出字符串的长度相同,并且它不接受字典输入。做这些翻译不太好。【参考方案6】:

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

【讨论】:

注意代替 dv:作者在发布此答案后编辑了问题,以澄清 re.escape 不是他们想要的。 @Air:我会在某个时候调查确切的不兼容性,但问题的作者认为它不起作用,因为它双重转义,但那是因为它们是在 REPL 中使用它,那就是 repr()。对于给出的示例,它实际上并没有这样做,并且在 Nginx 中确实有效。

以上是关于如何使用单个反斜杠转义字符串的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在字符串中使用反斜杠 (\)?

javascript反斜杠 “\” 的有啥特殊作用?

特殊字符一一反斜杠()

java 字符串反斜杠怎么转义

java 和 JS(javaScript)中的反斜杠正则转义

sql特殊字符怎么转义