添加反斜杠而不转义

43 投票
6 回答
172073 浏览
提问于 2025-04-15 18:44

我需要在一个字符串中处理一个 &(也就是“和”符号)字符。问题是每当我用 string = string.replace ('&', '\&') 进行替换时,结果变成了 '\\&'。多了一个反斜杠,是为了转义原来的反斜杠。我该怎么去掉这个多余的反斜杠呢?

6 个回答

25

在Python中,\这个符号在字符串中有特别的用法。
这意味着你可以输入'\n'来表示换行,或者'\t'来表示制表符(也就是Tab键)。
而像'\&'这样的组合对Python来说没有特别的意义,所以Python会自动帮你加上一个额外的\,这样就不会出错了。

其实,使用\\&或者r'\&'会更好,而不是直接用'\&'

这里的r表示“原始字符串”,意思是\不会被特别处理,除非它出现在字符串开头的引号前面。

在交互式控制台中,Python用repr来显示结果,所以你会看到两个\。如果你用print输出你的字符串,或者用len(string)来查看长度,你会发现其实只有两个字符。

以下是一些例子:

>>> 'Here\'s a backslash: \\'
"Here's a backslash: \\"
>>> print 'Here\'s a backslash: \\'
Here's a backslash: \
>>> 'Here\'s a backslash: \\. Here\'s a double quote: ".'
'Here\'s a backslash: \\. Here\'s a double quote: ".'
>>> print 'Here\'s a backslash: \\. Here\'s a double quote: ".'
Here's a backslash: \. Here's a double quote ".

为了更清楚地说明彼得在评论中提到的观点,可以查看这个链接

与标准C不同,所有未识别的转义序列在字符串中保持不变,也就是说,反斜杠会保留在字符串中。(这种行为在调试时很有用:如果转义序列写错了,输出结果更容易被识别为错误。)还需要注意的是,上表中标记为“(仅限Unicode)”的转义序列,对于非Unicode字符串字面量来说,属于未识别的转义序列。

29

多出来的反斜杠其实并不是被真正添加上去的;它只是由 repr() 函数加上的,用来表示这是一个字面上的反斜杠。当我们需要打印一个表达式的结果时,Python 解释器会使用 repr() 函数(这个函数会调用对象的 __repr__() 方法)。

>>> '\\'
'\\'
>>> print '\\'
\
>>> print '\\'.__repr__()
'\\'
71

结果 '\\&' 只是显示出来的,实际上这个字符串是 \&

>>> str = '&'
>>> new_str = str.replace('&', '\&')
>>> new_str
'\\&'
>>> print new_str
\&

你可以在命令行中试试看。

撰写回答