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

Posted

技术标签:

【中文标题】转义 Python 字符串中的特殊字符【英文标题】:Escape special characters in a Python string 【发布时间】:2011-05-11 07:02:32 【问题描述】:

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

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

【问题讨论】:

你认为什么是特殊字符? 完全取决于您的上下文。通常,当您将它们放在字符串中时,这些字符完全没问题。 Escaping regex string in Python 的可能重复项 这个问题最初并没有说明正则表达式,但这只是在三年后的一次编辑中添加的。由于我们已经有了一个很好的规范来转义正则表达式字符串,因此我将问题恢复为原来的含义,因为大多数答案也不是针对这种特殊情况。 【参考方案1】:

使用re.escape

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

在此重复:

重新转义(字符串)

返回所有非字母数字反斜杠的字符串;如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这将非常有用。

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

【讨论】:

您可以使用正则表达式模块而不是 re。一个例子是regex.escape(pattern,string,special_only=True【参考方案2】:

注意:此答案是针对原始问题编写的,该问题的编写方式是要求通用“可以[用于]转义特殊字符的函数”,但未指定这些将用于正则表达式,并且无需进一步指定 what 特殊字符必须被转义。

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

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\" :\

【讨论】:

如果反斜杠是characters 之一,最好是第一个!【参考方案3】:

使用 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" :\\'

【讨论】:

如果字符串是 unicode 则不起作用,因为您将拥有 u 并且应该运行 repr(x)[2:-1] 在python3.4中,所有字符串都是unicode,不幸的是,这似乎根本不起作用。相反,print(repr("I'm stuck")[1:-1]) 打印 I'm stuck【参考方案4】:

我很惊讶没有人通过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\"

需要注意的重要事项:

search 模式中,包括 \ 以及您要查找的字符。 你将使用\ 来转义你的角色,所以你需要转义 那个也是。 在 search 模式周围加上括号,例如([\"]),这样替换 当模式在其前面添加\ 时,可以使用找到的字符。 (就是这样 \1 确实:使用第一个带括号的组的值。) r'([\"])' 前面的r 表示它是一个原始字符串。原始字符串使用不同的 转义反斜杠的规则。要将([\"]) 写为纯字符串,您需要 将所有反斜杠加倍并写入'([\\"])'。原始字符串在以下情况下更友好 您正在编写正则表达式。 在 substitution 模式中,您需要转义 \ 以将其与 替换组之前的反斜杠,例如\1,因此是 r'\\\1'。来写 那个作为一个纯字符串,你需要'\\\\\\1'——没有人想要那个。

【讨论】:

【参考方案5】:

如上所述,答案取决于您的情况。如果你想为正则表达式转义字符串,那么你应该使用 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\" :\\

【讨论】:

【参考方案6】:

如果你只想替换一些字符,你可以使用这个:

import re

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

【讨论】:

以上是关于转义 Python 字符串中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

iOS:转义网址链接中的特殊字符问题

使用 SQLAlchemy 转义文件路径中的特殊字符

javascript 怎么把字符串中的特殊符号转义

Python代码试图将excel数据保存到数据库中 - 错误转义特殊字符

如何让在Html中特殊字符不被转义

如何转义xml中的特殊字符