转义 Python 字符串中的特殊字符

Python 是否有一个函数可以用来转义字符串中的特殊字符?

例如,I'm "stuck" :\应该变成 I\'m \"stuck\" :\\

238117 次浏览

使用 re.escape

>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

重复一遍:

Escape (字符串)

返回带有所有非字母数字反斜线的字符串; 如果您希望匹配可能包含正则表达式元字符的任意文本字符串,这非常有用。

从 Python 3.7开始,re.escape()改为只转义对正则表达式操作有意义的字符。

注意: 这个答案是为了回答最初的问题而写的,它要求使用一个通用的 “可用于转义特殊字符的函数”,没有指定这些将用于正则表达式,也没有进一步指定 什么特殊字符将必须转义。

为了转义一组任意的“特殊字符”,您可以编写一个自定义函数,用转义变量替换这些字符中的每一个。就像这样:

def escapeSpecialCharacters ( text, characters ):
for character in characters:
text = text.replace( character, '\\' + character )
return text


>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\

使用 repr ()[1:-1]。在本例中,不需要转义双引号。[-1:1]切片是为了删除开头和结尾的单引号。

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

或者您只是想转义一个短语粘贴到您的程序中? 如果是这样,请这样做:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'

我很惊讶没有人提到通过 re.sub()使用正则表达式:

import re
print re.sub(r'([\"])',    r'\\\1', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\\\1', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"')  # it\'s\ \"this\"

需要注意的重要事项:

  • 搜索模式中,包含 \以及您要查找的字符。 你将使用 \来转义你的角色,所以你需要转义 那个也是。
  • 搜索模式周围放上括号,例如 ([\"]),这样 < strong > 替换 当它在前面添加 \时,模式可以使用找到的字符 \1使用: 使用第一个括号中的组的值。)
  • r'([\"])'前面的 r表示它是 生绳。原始字符串使用不同的 转义反斜杠的规则。要将 ([\"])写成纯字符串,您需要 将所有反斜杠加倍并写入 '([\\"])'。当 你在写正则表达式。
  • 替代模式中,需要转义 \来将其与 在替换组之前的反斜杠,例如 \1,因此是 r'\\\1' 作为一个简单的字符串,您需要 '\\\\\\1' & mash; ,没有人想要这样的结果。

如上所述,答案取决于你的情况。如果想转义正则表达式的字符串,那么应该使用 re.escape ()。但是如果你想转义一组特定的字符,那么使用这个 lambda 函数:

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\

如果只想替换某些字符,可以使用以下命令:

import re


print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")

使用 json:

import json
print(r"""(I'm "stuck" :\)""")               # (I'm "stuck" :\)
print(json.dumps(r"""(I'm "stuck" :\)"""))   # (I'm "stuck" :\)

为 json 设置带转义字符的字符串

json.dumps(json.dumps(d))