2013-06-26 1263 views
23

在Python中,我試圖用雙反斜槓(「\」)替換單個反斜槓(「\」)。我有以下代碼:python用雙反斜槓替換單反斜線

directory = string.replace("C:\Users\Josh\Desktop\20130216", "\", "\\") 

然而,這給出了一個錯誤消息,它不喜歡的雙反斜線。誰能幫忙?

+0

像單反斜槓要麼 –

+0

這是不是要去那個字符串退格是[逃逸字符(http://docs.python.org/2/reference/lexical_analysis.html#grammar-token-escapeseq)。你不能單獨使用它。 – Santa

+0

你也可以使用正斜槓;可能對你更容易。 – squiguy

回答

33

無需使用str.replacestring.replace這裏,只是字符串轉換爲原始字符串:

>>> strs = r"C:\Users\Josh\Desktop\20130216" 
     ^
      | 
     notice the 'r' 

下面是repr版本上面的字符串的,這就是爲什麼你看到這裏\\。 但是,實際上字符串實際上只包含'\'而不是\\

>>> strs 
'C:\\Users\\Josh\\Desktop\\20130216' 

>>> s = r"f\o" 
>>> s   #repr representation 
'f\\o' 
>>> len(s) #length is 3, as there's only one `'\'` 
3 

但是,當你要打印此字符串你不會得到輸出'\\'

>>> print strs 
C:\Users\Josh\Desktop\20130216 

如果你希望字符串顯示在print'\\'然後用str.replace

>>> new_strs = strs.replace('\\','\\\\') 
>>> print new_strs 
C:\\Users\\Josh\\Desktop\\20130216 

repr版本現在將顯示\\\\

>>> new_strs 
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216' 
+0

你如何確保現有的'\\'不會翻倍?例如。你只需要最大的雙反斜槓(在'print'版本中)? – Demis

+0

@Demis你能舉一個例子嗎? –

+0

我有一個腳本,我需要存儲的文件路徑包含雙「\」(要發送到需要此轉義的程序),但輸入文件路徑有時已經包含了這個(由用戶/ Python腳本提供),以及有時不(只包含單個 - )。我想清理輸入以確保所有的\ \轉換爲\\。例如。如果用戶知道程序的\\語法,用戶可能會提供\\,但如果他們不提供單個\\。我*一直只需要單個 - ,但認爲在任何情況下都可以適當地對此進行消毒。 – Demis

8

使用轉義字符:"full\\path\\here""\\""\\\\"

+1

Python的詞法分析方式,'r「\」'或'r「\\」'不會像您期望的那樣工作。 – Santa

+0

'r'\''不正確,這會引發'EOF'錯誤,因爲您實際上是在逃避結束語。 –

+0

現在改變了。 – alexpinho98

-2

用途:

string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\") 

逃離\字符。

+1

你最後一個論點應該是''\\\\''。 – Santa

+0

我認爲你的意思是最後一個是'r'\\''或'\\\\' –

+1

使用原始字符串然後應用替換的意義何在? –

0

也許在你的情況下,語法錯誤, 您可以將該行更改爲:

directory = str(r"C:\Users\Josh\Desktop\20130216").replace('\\','\\\\') 

,給你正確的輸出如下:

C:\\Users\\Josh\\Desktop\\20130216 
0

由於源字符串,操作與os.path可能會更有意義,但這裏有一個字符串的解決方案;

>>> s=r"C:\Users\Josh\Desktop\\20130216" 
>>> '\\\\'.join(filter(bool, s.split('\\'))) 
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216' 

注意split對待\\源字符串作爲分隔空的字符串中。使用filter可以清除那些空字符串,因此join不會使已加倍的反斜槓加倍。不幸的是,如果你有3個或更多,他們會減少到加倍反斜槓,但我不認爲這會傷害你的Windows路徑表達式。

0

反斜線表示特殊的轉義字符。因此,directory = path_to_directory.replace("\", "\\")會導致Python認爲替換的第一個參數直到第二個參數的起始引號才結束,因爲它將結束引用理解爲轉義字符。

directory=path_to_directory.replace("\\","\\\\") 
6

讓我簡單明瞭。讓我們使用python中的re模塊來轉義特殊字符。

Python腳本:

import re 
s = "C:\Users\Josh\Desktop" 
print s 
print re.escape(s) 

輸出:

C:\Users\Josh\Desktop 
C:\\Users\\Josh\\Desktop 

說明:

現在觀察逃脫的特殊字符是 re.escape功能給定的字符串,我們可以在每個反斜槓之前添加另一個反斜槓,最後輸出結果爲雙反斜槓,即所需的輸出。

希望這可以幫助你。

+0

請提供一些上下文和解釋以配合您的代碼。同時檢查你的代碼的格式。 –

+0

@JamesK對不起,我解釋一下。讓我糾正它。 –

+1

很棒,有一個功能可以爲你做到這一點!這正是我需要的,比四重反斜槓漂亮得多。確實簡單明瞭。 – Demis

2

在python中\(反斜槓)用作轉義字符。這意味着在需要插入特殊字符(例如換行符)的地方,您可以使用反斜槓和另一個字符(\n換行)

以您的示例刺痛您會注意到,當您將"C:\Users\Josh\Desktop\20130216"你會得到"C:\\Users\\Josh\\Desktop\x8130216"。這是因爲\2在python sting中有特殊含義。如果你想指定\那麼你需要在你的字符串中輸入兩個\\

"C:\\Users\\Josh\\Desktop\\28130216"

另一種選擇是,通知蟒蛇您的整個刺痛絕對不能用\由前未決的刺痛轉義字符與r

r"C:\Users\Josh\Desktop\20130216"

這是一個「生「字符串,並且在需要使用大量反斜槓(例如正則表達式響尾蛇)的情況下非常有用。

如果您仍然希望以取代單一\\\你會再使用:

directory = string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\\\")

注意,我不是在最後兩個刺上面使用r'。這是因爲,當您使用刺的r'形式不能結束與一個\

Why can't Python's raw string literals end with a single backslash?

https://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-are-escape-characters/

相關問題