2014-10-02 14 views
0

我對r的實際操作有些困惑,並且無法理解與其相關的其他解釋。例如,是什麼s1s2之間的區別:在Python中對字符串文字使用`r`

s1 = r'this\\has\no\special\characters' 

編輯:

s2 = 'this\\has\no\special\characters' 

感謝

+0

那些是100%相同,我認爲你需要刪除'r'在第一他們 – Kasramvd 2014-10-02 15:06:43

+0

之一,您是不是要離開掀起了'\''中s2'? – mgilson 2014-10-02 15:06:50

+0

如果你從一個「r」中刪除,你會看到不同之處。 – chepner 2014-10-02 15:07:48

回答

2

不同的是,s1有間 「this」 和「有2個反斜槓「和s2只有1個。另外,s2\n處換行,而s1沒有。如果您打印字符串,差異將變得非常清晰。

基本上,在字符串文字前面跟r,你看到的是你所得到的。如果沒有前面r,蟒蛇會翻譯各種轉義碼(\t\n\\等)爲不同的字符(製表符,換行符\等)

有1個疑難雜症,我知道的。 .. r'\'SyntaxError ...

1

你可以看到,在r使得原始字符串所以斜線和任何控制字符正確處理(在第一種情況第一種情況下,你現在有一個雙斜槓),與\n現在成爲新行的字符串2進行比較:

In [218]: 

s1 = r'this\\has\no\special\characters' 
print(s1) 
s2 = 'this\\has\no\special\characters' 
print(s2) 
this\\has\no\special\characters 
this\has 
o\special\characters 

東西要小心使用原始字符串建設的路徑,如果路徑中包含一個尾隨回斜線,那麼這將不會被處理:

In [220]: 

path = r'c:\mytemp\' 
    File "<ipython-input-220-ca80e74afea4>", line 1 
    path = r'c:\mytemp\' 
         ^
SyntaxError: EOL while scanning string literal 
0

第一個(s1)是一個正則表達式集,其次就是一個字符串!並基於python doc

正則表達式使用反斜槓字符('\')來指示特殊形式或允許使用特殊字符而不用調用其特殊含義。這與Python在字符串文字中用於相同目的的相同字符的使用相沖突;例如,以匹配反斜槓,人們可能不得不寫'\\\\'作爲圖案串,因爲正則表達式必須是\\,並且每個反斜槓必須表示爲\\一個常規的Python字符串文字內。

解決方法是使用Python的原始字符串符號表示正則表達式模式;在以'r'爲前綴的字符串文字中,不以任何特殊方式處理反斜槓。所以r「\ n」是一個包含'\''n'的兩個字符的字符串,而「\ n」是一個包含換行符的單字符字符串。通常,模式將使用此原始字符串表示法以Python代碼表示。 所以你必須:

>>> s1 = r'this\\has\no\special\characters' 
>>> s1 
'this\\\\has\\no\\special\\characters' 
>>> s2 = 'this\\has\no\special\characters' 
>>> s2 
'this\\has\no\\special\\characters'