Python
單元:資料結構 - 字串(str)
主題:多行字串與轉義字元
簡介
在程式開發中,字串是最常見的資料型別之一,幾乎所有的輸入、輸出、日誌、設定檔都以文字形式存在。當我們需要一次處理多行文字(例如說明文件、HTML 模板或 SQL 查詢),或是必須在字串內表示特殊符號(如換行、引號、反斜線),就會碰到「多行字串」與「轉義字元」的需求。
如果不了解 Python 提供的多行字串語法與轉義機制,往往會出現語法錯誤、意外的換行或是資料遺失的問題。相反的,善用這兩項特性不僅可以讓程式碼更簡潔,也能提升可讀性與維護性,對於撰寫 CLI 工具、網頁模板、測試資料 等實務應用尤為重要。
本篇文章將從概念說明、實作範例、常見陷阱與最佳實踐,完整地帶你掌握 Python 中的多行字串與轉義字元,讓你在日常開發中得心應手。
核心概念
1. 單行與多行字串的基本差異
- 單行字串:使用單引號 (
') 或雙引號 (") 包住的字串,預設只能寫在同一行。 - 多行字串:使用三個單引號 (
''') 或三個雙引號 (""") 包住的字串,允許跨越多行,且保留換行與縮排。
Tip:三引號字串同時支援 原始字串(
r"""...""")與 格式化字串(f"""..."""),讓它在處理特殊字元與變數插值時更彈性。
2. 轉義字元(Escape Sequences)
在字串中,如果要表示 本身具有特殊意義的字元,必須使用反斜線 \ 進行「轉義」。常見的轉義序列包括:
| 轉義序列 | 代表的字元 | 說明 |
|---|---|---|
\\ |
\ |
反斜線本身 |
\' |
' |
單引號 |
\" |
" |
雙引號 |
\n |
換行 (LF) |
新的一行 |
\r |
回車 (CR) |
回到行首 |
\t |
Tab | 水平定位 |
\b |
退格 | 向左刪除一個字元 |
\uXXXX |
Unicode 編碼 | 例如 \u4F60 → 你 |
\xhh |
十六進位字元 | 例如 \x41 → A |
注意:在 原始字串(前置
r)中,除最後一個字元是反斜線外,所有的\都不會被當作轉義符號。
3. 三引號字串的行首/行尾空白處理
Python 會保留三引號字串內的所有空白與換行,包括開頭與結尾的 第一個換行。若不想讓字串最前面出現多餘的換行,可以:
text = """第一行文字
第二行文字"""
或是使用 字串切片或 textwrap.dedent 來去除不必要的縮排。
程式碼範例
以下示範 5 個實務上常見的多行字串與轉義字元使用情境,並在每段程式碼中加入說明註解。
範例 1:基本的多行字串(保留換行)
# 使用三雙引號建立多行字串,換行會被保留下來
doc = """\
使用說明:
1. 輸入您的帳號
2. 輸入密碼
3. 按下登入按鈕
"""
print(doc)
重點:在字串開頭加上
\(反斜線)可以避免第一行的空白換行,使輸出更整齊。
範例 2:原始字串搭配多行(避免轉義)
# 原始字串 r"""...""" 讓反斜線不會被解釋為轉義符號
regex_pattern = r"""^
\d{4} # 年份四位數
- # 中間的連字號
(0[1-9]|1[0-2]) # 月份 01~12
- # 再一次連字號
(0[1-9]|[12]\d|3[01]) # 日期 01~31
$"""
print(regex_pattern)
說明:此範例常用於撰寫 正規表達式,使用原始字串可以避免
\d、\n等被誤解為其他字元。
範例 3:格式化字串(f-string)與多行結合
name = "Alice"
score = 92.5
# f"""...""" 讓變數直接插入字串內
report = f"""\
學生成績單
--------------
姓名: {name}
分數: {score:.1f}
等級: {"優秀" if score >= 90 else "良好"}
"""
print(report)
技巧:使用
f"""同時支援 多行 與 變數插值,讓產生報表、郵件內容等文字模板變得非常簡潔。
範例 4:使用 textwrap.dedent 去除不必要的縮排
import textwrap
raw_sql = """
SELECT *
FROM users
WHERE created_at >= '2024-01-01'
AND status = 'active';
"""
# dedent 會把每行共同的前置空白去掉
clean_sql = textwrap.dedent(raw_sql).strip()
print(clean_sql)
說明:在程式碼中寫 SQL 或 HTML 時,常會因為程式碼縮排而產生多餘的空格,
textwrap.dedent能自動對齊,提升可讀性。
範例 5:在字串中插入 Unicode 符號與特殊字元
# 使用 \u 或 \N 直接寫入 Unicode 符號
emoji_line = "Python 開發者常用的表情:\U0001F40D \u2764\ufe0f"
print(emoji_line)
# 若要在字串內顯示反斜線本身,必須轉義
path = "C:\\Users\\Alice\\Documents\\project"
print(f"檔案路徑:{path}")
提示:
\\必須寫兩次才能在最終字串中呈現單一反斜線,這在 Windows 路徑或正則表達式中非常常見。
常見陷阱與最佳實踐
| 陷阱 | 可能的結果 | 解決方法 / 最佳實踐 |
|---|---|---|
忘記在三引號字串前加 r,導致 \n 被當作換行 |
正則表達式或檔案路徑出現意外換行 | 需要原始字串時,務必寫成 r"""...""" |
| 字串最前面的空行 造成不必要的換行 | 輸出時多出空白行,影響排版 | 在開頭加上 \ 或使用 """\\ 來抑制第一個換行 |
| 多行字串中的縮排 被保留下來,導致資料庫查詢失敗 | SQL、HTML、JSON 中出現前置空白,產生語法錯誤 | 使用 textwrap.dedent 或手動 .strip() |
在原始字串末尾放置單一反斜線,會產生 SyntaxError |
程式無法編譯 | 原始字串最後若需要 \,必須寫成 \\ 或使用普通字串加轉義 |
| 混用單引號與雙引號,導致字串內部需要大量轉義 | 可讀性下降 | 盡量選擇與字串內容不同的引號,或使用三引號包住 |
最佳實踐:
- 首選三雙引號 (
"""):在多行文字中,雙引號較不會與常見的程式碼字元衝突。 - 使用原始字串:處理檔案路徑、正規表達式或任何含有大量
\的文字時,先加r。 - 適度使用
textwrap.dedent:保持程式碼縮排美觀,同時確保輸出文字不受多餘空格影響。 - 避免在字串中硬編碼 Unicode:若需要顯示特殊符號,使用
\u或直接貼上符號,讓程式碼更直觀。 - 在需要動態插值時,使用 f-string:比
format()或%更簡潔且效能更佳。
實際應用場景
| 場景 | 為何需要多行字串與轉義字元 | 範例說明 |
|---|---|---|
| 產生電子郵件模板 | 內容往往包含多段文字、變數、HTML 標籤,需要保留排版 | 使用 f"""...""" 結合使用者名稱與訂單資訊 |
| 寫入設定檔(INI、YAML、JSON) | 設定檔可能跨多行,且需要保留縮排或特殊符號 | 使用三引號字串直接寫入預設設定,再寫入檔案 |
| SQL 查詢或 NoSQL 指令 | 查詢語句往往跨行,且需要保持關鍵字對齊,避免手動加 \n |
textwrap.dedent(""" SELECT ... FROM ... """) |
| 建立測試資料(多行文字、程式碼片段) | 單元測試常需模擬檔案內容或 API 回傳的文字 | 原始字串 r"""...""" 防止意外轉義 |
| 產生程式碼生成器 | 需要在字串中嵌入其他程式碼,且保留縮排與特殊字元 | 使用 f-string + dedent 產生 Python / HTML 模板 |
總結
- 多行字串(三引號)讓我們可以一次書寫跨越多行的文字,保留原始的換行與縮排。
- 轉義字元 為字串提供了表示特殊符號的方式,熟悉常見的
\n、\t、\\、\uXXXX等序列是避免錯誤的關鍵。 - 原始字串、格式化字串(f-string)與
textwrap.dedent是處理實務需求時的利器,能讓程式碼更乾淨、可讀性更高。 - 常見的陷阱包括未使用原始字串導致意外換行、字串前後多餘的空白行、縮排被保留等,透過上述的最佳實踐即可輕鬆化解。
掌握了多行字串與轉義字元,你就能更自信地撰寫 報表、模板、SQL、正規表達式 等任何需要大量文字處理的程式,提升開發效率與程式品質。祝你在 Python 的文字世界裡玩得開心!