如何使用单个反斜杠转义字符串的特殊字符
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)
【讨论】:
@hcwhsastring.translate
和 a_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 中确实有效。以上是关于如何使用单个反斜杠转义字符串的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章