Python
escape sequence
• Definition (定義)
• List of Escape Sequence (常見的跳脫序列)
• Escape Quotes (引號使用)
• Escape Backslash (反斜線使用)
• Escape NewLine (換行使用)
• Escape Carriage Return (回車使用)
• Escape Horizontal Tab (水平定位使用)
• Escape Backspace (退格使用)
• Escape Unicode (萬國碼使用)
• Escape Octal (八進位字元使用)
• Escape Hexadecimal (十六進位字元使用)
• Raw String (原始字串)
什麼是跳脫序列呢?
在字串中,有些字元是無法直接輸入或顯示的,因此需要使用跳脫序列來表示這些特殊字元。
跳脫序列是由反斜線 (backslash) 加上一個字元所組成,例如 \n 表示換行,\t 表示水平定位,\\ 表示反斜線本身。
所以我們可以認為
跳脫序列可以幫助我們表達那些很難或無法直接表示的字元。
Escape Sequence | Meaning |
---|---|
\" | 雙引號 |
\' | 單引號 |
\\ | 反斜線 |
\n | 換行 |
\r | 回車 |
\t | 水平定位 |
\b | 退格 |
\N{name} | 查找Unicode資料庫中的名稱 |
\u0000 | 16位元的Unicode字元 |
\U00000000 | 32位元的Unicode字元 |
\ooo | 8進位字元 |
\xhh | 16進位字元 |
在講L2 Primitive types的時候我們有講到Python使用單雙引號來定義 str,當字串內部需要使用引號時,除了避免內外使用相同引號之外,還有一個方法就是使用跳脫序列。
以下為範例:
string = 'I'm good at Python.' # SyntaxError
上述的程式碼會產生語法錯誤導致程式終止。
而我們可以使用跳脫序列來避免錯誤:
string = 'I\'m good at Python' # I'm good at Python
雖然這邊使用的是單引號,但在雙引號上的用法是完全相同的,就不再贅述。
在引號前方加入 \ 就可以讓引號跳脫出字串變成單純的字元,不再有當作字串辨識符號的意義。
既然我們已經知道 \ 在字串中代表著跳脫字元,那我們又該如何輸出他們本身呢?
以下為範例:
string = "C:\Python\test.py" # C:\python est.py
上述的程式碼因為 \ 被當作跳脫字元使用,因此會結合有特殊定義的字元形成跳脫序列,也就沒辦法正常地輸出我們想要的檔案位址。
而我們同樣可以使用跳脫序列來正常輸出這些位址。
string = "C:\\Python\\test.py" # C:\Python\test.py
這邊的第一個 \ 當作跳脫字元,讓第二個 \ 可以做為單純的字元做輸出,不再有當作跳脫字元的意義。
如果想要讓字串做出換行的動作的話,\n 是個很常見的用法。
以下為範例:
string = "Hello\nWorld" # Hello
# World
上述的程式碼在 Hello 及 World 中間使用 \n ,它可以讓游標跳到下一行行首在繼續輸出接下來的字串,因此這兩個單字就會被分成兩行。
\r 的功能比較特殊,他可以讓游標回到行首再繼續以接下來的字串覆蓋掉之前的字元。
以下為範例:
string = "Justin loves Python\rMatcha" # Matcha loves Python
再上述的程式碼中,因為 \r 後面的 Matcha 有6個字元,而 Justin 也剛好有6個字元,於是在使用回車會到行首後,Matcha剛好覆蓋掉Justin,所以結果為Matcha loves Python。
# Origin: Justin loves Python
# Change: Matcha
# Output: Matcha loves Python
我們再看下個例子:
string = "You love Python\rI" # Iou love Python
由於 I 只有一個字元,當游標回到行首時,他只會覆蓋掉 Y 而其他字元不受影響。
# Origin: You love Python
# Change: I
# Output: Iou love Python
如果想知道更多關於 \r 和 \n 的差異可以看我的IG貼文:
相信學習Python的各位應該都知道tab是很常使用的縮排功能,通常為4個或8個空格。
而我們也可以在字串中使用 \t 來代表 tab。
以下為範例:
string = "Hello\tWorld" # Hello World
從上述的程式碼可以看出 \t 的功能就像按下 tab 一樣在字串中產生空格。
舉個常見的例子:
string_1 = "2\tx\t2\t=\t4" # 2 x 2 = 4
string_2 = "7\tx7\t=\t49" # 7 x 7 = 49
stirng_3 = "10\tx\t10\t=\t100" # 10 x 10 = 100
\t 可以很好的幫我們做出排版。
其實 \b 的用法就和我們鍵盤上的 Backspace 一樣,可以刪除掉前一格字元。
以下為範例:
string = "Hello \bWorld" # HelloWorld
在上述的例子中,\b 的作用就是刪除掉他前面的空格,於是Hello和World就相連在一起了。
我們再看下個例子:
string = "Have a nice d\t\bay" # Have a nice day
\b 除了空格也能刪除其他字元甚至是其他跳脫序列。
上面的圖片是一個飛機的表情符號,通常我們要在程式中使用表情符號或其他特殊字元,我們會使用Unicode來表示,而首先要介紹的是使用 emoji 的名稱。
以下為範例:
string = "\N{Airplane}" # ✈
在上述的例子中,我們會使用 \N 這個跳脫序列,後面接上 {},裡面放上表情符號的名稱,比較需要注意的是 N 要為大寫,否則會和小寫的換行混淆。
而我們還有另一個方法同樣可以叫出這個表情符號,就是使用 \u 這個跳脫序列,可以看到在上面飛機的下方有一個U+2708的編碼,這就是他在Unicode中的編碼,而我們也需要使用到它。
以下為範例:
string = "\u2708" # ✈
省略掉 U+ 的部分,剩餘的就是我們需要用到的,直接接在 \u 後面就可以同樣表示該Unicode字元。
但這邊有一件事需要特別注意,有些表情符號可能它的編碼會超過4個字元,像U+1F680,這個時候我們就不能使用 \u 來表示這個符號,因為 \u 後面最多只能接收4個字元,因此必須使用下面的方法來替代。
當我們的Unicode Number超過4個字元時,除了使用 \N 及名稱以外,我們也可以使用 \U 這個跳脫序列。
以下為範例:
string = "\U00002708" # ✈
由於 \U 要接收8個字元,因此我們必須將剩餘的部分用0補齊,這樣才能正常地輸出我們想要的字元。
同樣地,像剛剛舉例的U+1F680就可以用這個方法呈現:
string = "\U0001F680" # 🚀
同樣使用0補齊直到總共為8個字元。
如果不知道甚麼是Unicode的可以看我的IG貼文:
我們也可以使用 \ooo 來使用ASCII Table中的八進位編碼來表示字元,使用方法為在 \ 後方直接接上3個數字。
以下為範例:
string = "\110\105\114\114\117\040\127\117\122\114\104" # HELLO WORLD
和上面的八進位字元使用一樣,使用ASCII Table內的十六進位編碼來表示字元,使用方法為在 \x 後方接上2個數字。
以下為範例:
string = "\x48\x45\x4C\x4C\x4F\x20\x57\x4F\x52\x4C\x44" # HELLO WORLD
如果不知道甚麼是ASCII的可以看我的IG貼文:
我們有一種方法可以忽略在字串中的特殊字元,就是在宣告字串時將他宣告為raw string,具體做法就是在字串的引號前方加上 r 或是 R。
以下為範例:
string = "Hello \bWorld" # HelloWorld
在正常宣告的字串中跳脫序列會發揮它的作用,而使用原始字串就可以讓它變成單純的字元。
string = r"Hello \bWorld" # Hello \bWorld
這也可以應用在之前說到取檔案位址的功能。
string = r"C:\Python\test.py" # C:\python\test.py
但是raw string有一點比較特別的是,如果將 \ 放在字串的最後,會導致當成判斷字串的引號被當成跳脫序列而產生錯誤。
具體如下:
string = r"\" # SyntaxError
上方用來判斷字串的引號被 \ 嘗試變成跳脫序列,導致字串無法定義。
string = r"a\\" # a\\
而在上述的程式碼中 \ 互相變成跳脫序列,所以不會影響到字串的判定,是可以正常運作的。
因此,raw string 的結尾不能有奇數個 \,會導致最後一個 \ 嘗試去跳脫引號導致錯誤。
如果有興趣了解更多歡迎追蹤我的
Intagram
Youtube
Github
也可以幫我按個讚賞喔