2010-02-01 58 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) 
\&