2010-02-01 119 views
17

我需要转义字符串中的&(与号)字符。问题是我结果是'\\&'。额外的反斜杠被添加来逃避原始的反斜杠。我如何删除这个额外的反斜杠?在不转义的情况下添加反斜杠[Python]

+0

知道小人物:字符串= string.replace('&','&')...也许替换方法会跳过你的&符号... heh – iandisme 2010-02-01 19:43:27

+6

如果你仍然使用它,请标记一个解决方案! – erikbwork 2012-08-07 08:51:16

+0

@Veedrac:这个4岁的问题如何标记为6天前问的问题的重复? – User 2014-06-12 15:46:25

回答

17

额外的反斜杠并未实际添加;它只是由repr()函数添加来表示它是一个文字反斜杠。 Python解释器使用repr()功能(该对象上调用__repr__())当需要打印的表达式的结果:

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

没有额外的反斜杠,它只是格式化的交互式环境的方式。尝试:

print string 

然后你就可以看到真的没有多余的反斜杠。

55

结果'\\&'只显示 - 实际上字符串是\&

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

尝试在一个外壳。

+7

为什么这不被标记为解决方案? – erikbwork 2012-08-07 08:50:53

5
>>> '\\&' == '\&' 
True 
>>> len('\\&') 
2 
>>> print('\\&') 
\& 

换句话说:'\\&'只包含一个反斜杠。为了清晰起见,它只是在python shell的输出中转义出来。

12

Python以特殊的方式在文字字符串中对待\
这样,您可以键入'\n'意味着换行符'\t'意味着标签
由于'\&'并不意味着什么特殊到Python,而不是导致错误,Python的词法分析器隐含增加了额外的\您。

实际上它是更好地使用或代替\\&r'\&''\&'

r这里指原始字符串和手段,\不经过特殊处理,除非它在的开始引号字符前右是串。

在交互式控制台中,Python使用repr来显示结果,所以这就是您看到双“\”的原因。如果您print您的字符串或使用len(string)你会发现它真的是只有2个字符

一些例子

>>> '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 ". 

澄清这一点彼得使得在他的评论中看到this link

不像标准C,所有无法识别的 转义序列保留在 字符串中不变,即反斜杠 保留在字符串中。(这在调试时行为 是有用:如果一个转义 序列被错误地输入时,所得 输出被更容易地认为是 折断。)同样重要的是要注意 该转义序列标记为 “(Unicode的只)”在 以上的表中属于无法识别的 转义为非Unicode字符串 文字。

+0

部分内容不正确。 Python不会*“为你隐式添加额外的'\'。但是,当您显示字符串的repr()输出时(如提示时那样),它确实会加倍反斜杠,纯粹是为了演示目的。 len(“\&”)只有2,证明没有隐含的数据传输(谢天谢地!)。 – 2010-02-01 22:10:21

+0

@PeterHansen我认为OP指出通常应该在非原始字符串中转义黑色闪烁,所以通常会写入两倍。 – 2015-10-28 19:45:33

1

打印列表也可能导致此问题(在蟒蛇即时通讯新的,所以弄得我有点太):

>>>myList = ['\\'] 
>>>print myList 
['\\'] 
>>>print ''.join(myList) 
\ 

相似:约蟒蛇

>>>myList = ['\&'] 
>>>print myList 
['\\&'] 
>>>print ''.join(myList) 
\&