python 主義字符的使用

1  轉義字符的使用

在需要在字符中使用特殊字符時,python用反斜槓(\)轉義字符。如下表:

有時我們並不想讓轉義字符生效,我們只想顯示字符串原來的意思,這就要用r和R來定義原始字符串(raw string).如:

print r'\t\r'

實際輸出爲“\t\r”。

 

轉義字符 描述
\(在行尾時) 續行符
\\ 反斜槓符號
\' 單引號
\" 雙引號
\a 響鈴
\b 退格(Backspace)
\e 轉義
\000
\n 換行
\v 縱向製表符
\t 橫向製表符
\r 回車
\f 換頁
\oyy 八進制數yy代表的字符,例如:\o12代表換行
\xyy 十進制數yy代表的字符,例如:\x0a代表換行
\other 其它的字符以普通格式輸出


python實際使用中,是這樣的:
>>> s = '\\'
>>> s
'\\'
>>> print s
\
轉義字符在輸出或者使用的是有才會發揮效用。


2 關於原始字符傳(raw_string)的使用:
>>> path = r"C:\mydir\mysubdir\"
   File "<string>", line 1
     path = r"C:\mydir\mysubdir\"
                              ^
SyntaxError: EOL while scanning single-quoted strin
在使用raw string時,反斜槓雖然不再做轉義用,但它仍然保留了一部分“魔力”——保護字符串。當"\"在字符串末尾時,被視爲終結,python認爲其後應該還有東西,結果沒有,就報錯了。
那豈不是用raw string寫Windows路徑就很不方便了嗎?

答案是:raw string本來就不是爲了方便寫Windows路徑而設計的,而是爲了方便寫正則表達式設計的。在正則表達式中,反斜槓是轉義字符,因此不可能出現以反斜槓結尾的正則表達式。

Windows路徑的“正統”寫法應該是:

path = os.path.normcase("c:/mydir/mysubdir/")

os.path.normcase在Windows平臺下會自動把正斜槓轉換成反斜槓。

由於正則表達式使用反斜槓來轉義特殊字符,而python自身處理字符串時,反斜槓也是用於轉義字符,這樣就產生了一個雙重轉換的問題,要匹配字符串中1 個反斜槓應該怎麼寫正則表達式?"\\",這樣行嗎?試試就知道了,re模塊拋異常了,因爲"\\"就是一個反斜槓,對於正則表達式解析器來說,是一個轉 義字符,但是後面啥也沒有,自然就報錯了,"\\\"三個肯定是不行的,試試四個"\\\\",完美匹配。
view plaincopy to clipboardprint?
import re   
re_str_patt = "\\\\
reObj = re.compile(re_str_patt)   
str_test = "abc\\cd\\hh" 
print reObj.findall(str_test) 
import re
re_str_patt = "\\\\"
reObj = re.compile(re_str_patt)
str_test = "abc\\cd\\hh"
print reObj.findall(str_test)
      輸出:['\\', '\\']
      這裏要這麼理解,首先第一重轉換是字符串自身的轉義,那麼"\\\\",實際上就是表示兩個反斜槓(兩個字符),然後 傳入正則表達式解析器,因爲反斜槓依然是轉義字符,那麼進行第二重轉換,兩個反斜槓就代表一個反斜槓,所以就能和一個反斜槓進行匹配了,那麼匹配連續的兩 個反斜槓,寫正則表達式時就要寫8次"\"了,相當壯觀,要匹配/d+(這個在正則表達式裏面表示連續1一個以上的數字字符)這個字符串怎麼寫呢?
view plaincopy to clipboardprint?
import re   
re_str_patt = "\\\\d\\+" 
print re_str_patt   
reObj = re.compile(re_str_patt)   
print reObj.findall("\\d+") 
import re
re_str_patt = "\\\\d\\+"
print re_str_patt
reObj = re.compile(re_str_patt)
print reObj.findall("\\d+")
      寫成re_str_patt = "\\\\d\+"也行,因爲\+對於字符串來說,沒有轉義意義,所以就當成一個反斜槓了。
      在python中寫正則表達式時用得最多的是raw字符串,原生字符串,什麼意思?就是隻有一重轉換了,沒有字符串轉換了,只在正則表達式內部進行轉換 了,這樣匹配一個反斜槓的正則表達式可以這樣寫,re_str_patt = r"\\",有人會想,以後寫windows的文件路徑什麼的方便了,呵呵直接 path = r"c:\myforder\xx" 搞定,是的,這句沒有問題,但是如果你寫成 path = r"c:\myforder\xx\",直接報錯了,爲什麼?因爲反斜槓雖然不作爲轉義字符了,但是還是對它後面的引號(包括單引號)有影響,使這個引號 不被視爲字符串的終止,以爲它後面還有字符,但是實際沒有,因此會報錯。其實可以反過來想raw字符串裏面要表示引號怎麼辦呢?,可以發現 path = r"\\123\"xxx" 是可以的,那用raw字符串豈不是有侷限性?不過raw在設計之初就是用來支持正則表達式的,而在正則裏面反斜槓是轉義字符,所以不可能出現在字符串的末尾的,所以建議不要圖方便在其他的地方使用raw。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章