1. 程式人生 > >為什麼原始字串不能以單個反斜槓結尾?

為什麼原始字串不能以單個反斜槓結尾?

文章目錄


0. 參考資料

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


1. 現象

Python 的原始字串有很多應用場景,比如用來表示 Windows 的路徑和應用於正則表示式中。
但是在使用的時候卻發現,原始字串無法以單個反斜槓結尾,或者說,原始字串無法以奇數個反斜槓結尾


嘗試如下:

>>> r'\'
  File "<input>", line 1
    r'\'
       ^
SyntaxError: EOL while scanning string literal
>>> r'\\\'
  File "<input>", line 1
    r'\\\'
         ^
SyntaxError: EOL while scanning string literal

2. 解釋

大多數人的誤解在於認為原始字串裡的反斜槓與其他字元沒有什麼不同
這是錯的

r

或者 R 字首存在的時候,在反斜槓後面的字元保持不變,並且反斜槓本身會保留在字串中。

所以任何在反斜槓後面的字元都是原始字串的一部分
這樣一來:

  • r'abc\d'a, b, c, \, d 組成
  • r'abc\'d'a, b, c, \, ', d 組成
  • r'abc\''a, b, c, \, ' 組成

那麼,重點來了:

  • r'abc\'a, b, c, \, ' 組成,但是現在沒有結束字串的引號了

所以原始字串無法以單個的(奇數個的)反斜槓結尾。


3. 解決

方式 1

不在原始字串後面寫單個反斜槓,而是採用拼接的方式用普通字串加上反斜槓

>>> test = r'測試''\\'
>>> print(test)
測試\

方式 2

在原始字串後面寫兩個反斜槓,然後採用切片操作切除最後一個反斜槓。

>>> test = r'測試\\'[:-1]
>>> print(test)
測試\

方式 3

不使用原始字串,直接使用普通字串。

>>> test = '測試\\'
>>> print(test)
測試\

完成於 201810290705