本文 AI 產出,尚未審核

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 程式無法編譯 原始字串最後若需要 \,必須寫成 \\ 或使用普通字串加轉義
混用單引號與雙引號,導致字串內部需要大量轉義 可讀性下降 盡量選擇與字串內容不同的引號,或使用三引號包住

最佳實踐

  1. 首選三雙引號 ("""):在多行文字中,雙引號較不會與常見的程式碼字元衝突。
  2. 使用原始字串:處理檔案路徑、正規表達式或任何含有大量 \ 的文字時,先加 r
  3. 適度使用 textwrap.dedent:保持程式碼縮排美觀,同時確保輸出文字不受多餘空格影響。
  4. 避免在字串中硬編碼 Unicode:若需要顯示特殊符號,使用 \u 或直接貼上符號,讓程式碼更直觀。
  5. 在需要動態插值時,使用 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 的文字世界裡玩得開心!