本頁內容

Python 字串:轉換、清理、查找與格式化

字串是你在 Python 中最常接觸的資料型別:使用者輸入、檔案內容、網頁和 CSV 的每一列,都是以文字形式到達的。它們很容易被低估,因為 Python 字串是不可變的——沒有任何方法能就地修改它,每次操作都會回傳一個新字串。本頁將 DelftStack 的全部 115 篇字串指南按你要做的工作組織起來,沿著四條任務線展開:把文字轉換為其他型別再轉回來、清除不屬於這裡的字元、查找並檢查字串裡有什麼,以及為輸出格式化或替換文字。

Python 字串操作一覽:轉換、清理、查找與格式化文字

字串學習路徑

先用五分鐘掌握基礎:字串如何建立、如何索引和切片,以及為什麼不可變意味著你必須始終保留回傳值。接著學習查找與清理——find()、in 運算子、strip() 和 replace() 能處理日常文字工作的大部分。然後進入轉換,字串在這裡與列表、數字、字典和位元組互換位置。最後是格式化與替換,f 字串是預設選擇,舊式寫法只在仍有用武之地時才出現。以下每一步對應本頁的一個分組,順序就是學習順序。

五分鐘基礎:建立、拼接與重複

字串是由單引號或雙引號包圍的字元序列;三引號可以跨多行,索引加切片可以讀取它的任意部分。有兩個事實承擔了大部分工作:len() 測量字串的長度,而建立一個更長的字串總是產生一個新值。

  • 在 Python 中重複字串 N 次 — 用 * 乘法生成固定份數的副本,再用重複加切片精確命中目標長度,並對空來源和負長度做校驗。
  • 在 Python 中複製字串 — 在解釋了不可變性為何讓兩個變數共享同一個值之後,給出六種複製途徑——空字串拼接、完整切片、str()、%、format() 和 f 字串。
  • 在 Python 中建立一個多行字串 — 真正的多行文字用三引號,一個邏輯行用反斜線和括號拼接,定寬輸出用 textwrap.fill()。
  • How to Append One String to Another in Python — + 與 str.join() 的對比;片段很多時 join() 勝出,因為每次 + 都會建立一個新的中間字串。

轉換:字串與列表、數字互轉

轉換是字串工作真正見價值的地方:資料以文字到達,又以另一種形態被使用。列表是最繁忙的出入口,數字次之;容器用 str() 或 join() 攤平,位元組只能透過顯式編碼跨越。有一個鄰居住在別處:把 datetime 轉成字串屬於 Datetime 指南——見 在 Python 中將日期時間轉換為字串 和 Python 支柱 的 Datetime 一節。

清理與刪除:去掉不屬於這裡的東西

清理是這個集群的主場:抓取的頁面、匯出檔案和使用者輸入到達時都帶著從未被邀請的字元。按污垢的形態來選:一個已知的子字串用 replace(),一整組字元一次性處理用帶轉換表的 translate(),污垢是模式而非字面量時用正規表示式。

查找、檢查與計數

查找是這個集群最大的未滿足需求:讀者知道自己想要哪個字元,需要的是它的位置、它的數量,或一個是與否的答案。把分工理清——in 回答有沒有,find() 回答第一個在哪裡,index() 回答在哪裡並在找不到時大聲報錯,count() 回答有多少個。

大小寫、比較與填充

大小寫是比較悄悄出錯的地方:Python 按 Unicode 碼點比較,所以大小寫和特殊字母都算數。比較前先正規化——普通文字用 lower() 或 upper(),需要讓 Unicode 配對相等時用 casefold()——展示時再用 ljust()、rjust()、center() 或 zfill() 填充。

格式化與替換

對新程式碼來說,格式化就是 f 字串:值就坐在範本裡你能讀到的位置,格式規格控制寬度和精度。當範本獨立存放或要重用時,str.format() 依然是對的選擇,而 % 格式化則存活在你還會遇到的舊程式碼裡。替換和一切其他操作一樣服從不可變性——你從不編輯一個字串,你建立那個修正後的新字串。

  • 在 Python 中替換字串中的字元 — 按索引轉列表賦值、在已知位置前後切片,或用 replace() 處理每個匹配——每種都回傳新字串。
  • Python 字串格式中 %s 和 %d 的區別 — %s 透過 str() 轉換接受任何值;%d 要求整數並截斷小數——大多數意外背後的那條歷史區分。
  • The sprintf() Function in Python — Python 沒有 sprintf();這項工作對應到 % 運算子、format()、f 字串,或一個手寫的包裝函式。
  • 在 Python 中的索引處替換字串中的字元 — Meatloaf 例子兩種解法——切片重建,或修改列表副本——並擴展到多個索引。

字串方法地圖

Python 內建了 47 個字串方法,這張地圖能幫你快速找到對的那個。按動詞來讀:is* 家族負責檢查,大小寫方法負責變換,split 和 join 負責拆開與重組,搜尋方法負責定位。某個方法有更深入的指南時,第三列會鏈過去;儲存格為空表示一句話說明已經足夠。

方法 作用 深入閱讀
capitalize() 將第一個字元大寫,其餘字元小寫
casefold() 為不區分大小寫的匹配而生的激進小寫化 深入閱讀
center() 把字串放在給定寬度欄位的中央 深入閱讀
count() 統計子字串不重疊出現的次數 深入閱讀
encode() 按選定的編碼把字串編碼為位元組
endswith() 測試字串是否以某個後綴結尾
expandtabs() 把製表符替換為空格
find() 子字串的最小索引,找不到時為 -1 深入閱讀
format() 把值格式化進 {} 佔位符
format_map() 與 format() 類似,但值取自一個對映
index() 子字串的最小索引,找不到時拋出 ValueError 深入閱讀
isalnum() 每個字元都是字母或數字時為 True 深入閱讀
isalpha() 每個字元都是字母時為 True
isascii() 每個字元都是 ASCII 時為 True
isdecimal() 每個字元都是十進位數字時為 True
isdigit() 每個字元都是數字時為 True 深入閱讀
isidentifier() 字串是合法的 Python 識別符時為 True
islower() 所有帶大小寫的字元都是小寫時為 True
isnumeric() 每個字元都是數值時為 True
isprintable() 每個字元都可列印時為 True
isspace() 每個字元都是空白時為 True
istitle() 字串是標題式大小寫時為 True
isupper() 所有帶大小寫的字元都是大寫時為 True
join() 以本字串為分隔符連接一個字串可迭代物件
ljust() 在給定寬度的欄位中左對齊 深入閱讀
lower() 回傳小寫副本 深入閱讀
lstrip() 去除前導字元(預設為空白)
maketrans() 為 translate() 建立轉換表 深入閱讀
partition() 在第一個分隔符處切成三元組
removeprefix() 存在前綴時將其去除
removesuffix() 存在後綴時將其去除
replace() 把子字串的出現替換為另一個字串 深入閱讀
rfind() 子字串的最大索引,找不到時為 -1 深入閱讀
rindex() 子字串的最大索引,找不到時拋出 ValueError
rjust() 在給定寬度的欄位中右對齊 深入閱讀
rpartition() 在最後一個分隔符處切成三元組
rsplit() 從右側計數,在分隔符處拆分
rstrip() 去除尾部字元(預設為空白)
split() 在分隔符處拆分為列表 深入閱讀
splitlines() 在行邊界處拆分為列表
startswith() 測試字串是否以某個前綴開頭 深入閱讀
strip() 去除前導和尾部字元 深入閱讀
swapcase() 回傳每個字元大小寫互換的副本
title() 回傳標題式大小寫的副本,每個單詞首字母大寫
translate() 透過轉換表對映字元 深入閱讀
upper() 回傳大寫副本 深入閱讀
zfill() 用前導零填充到給定寬度 深入閱讀

常見問題

在 Python 中如何把字串轉換為列表?

先決定每個元素應該是什麼,再挑對應的工具。list(text) 按字元逐個給出元素;text.split() 給出單詞,text.split(",") 給出以分隔符切分的欄位,並保留空欄位。對於已經長得像 Python 列表的文字,用 ast.literal_eval() 解析,並確認結果確實是列表。絕不要對你無法控制的輸入使用 eval()。完整講解見 如何在 Python 中將字串轉換為列表。

如何檢查字串是否包含某個子字串或單詞?

做簡單的子字串測試,用 in 運算子:"word" in text 回傳布林值,且區分大小寫。還需要位置時,find() 回傳第一個索引或 -1,而 index() 則會拋出 ValueError。注意 in 也會在更大的單詞內部命中——"is" in "This" 為真——所以針對整詞時,要麼分詞,要麼用帶 \b 邊界的正規表示式,如 在 Python 中檢查字串是否包含單詞 所示。

如何從字串中刪除標點或特殊字元?

先定義什麼必須去掉:只是標點,還是字母和數字之外的一切。對於標點,可以對 string.punctuation 過濾、用正規表示式 [^\w\s] 替換,或用 maketrans() 建立的 str.translate() 轉換表一次性刪除整組字元——這是最快的選項。清理範圍更大時,isalnum() 過濾會保留 Unicode 字母和數字。如何在 Python 中從一個字串中刪除標點符號 逐一講解了每種變體。

為什麼 Python 會說「not all arguments converted during string formatting」?

這個 TypeError 來自 % 格式化:範本中的佔位符比你傳的值元組要少,於是 Python 走到範本末尾時還剩下沒用完的參數——例如 "Value: " % (1, 2)。讓每個值恰好對應一個佔位符,單個值用只含一個元素的元組包裝,字面的百分號寫成 %%` 轉義。有一篇專門講這個錯誤的指南逐例拆解了這條訊息。

Python 裡有 toString() 嗎?

沒有。Python 沒有 toString() 方法;找它是從 Java 帶過來的習慣。等價物是內建的 str(value),它能為數字、集合和大多數物件回傳可讀的字串。要合併許多字串用 join(),建立訊息用 f 字串,想控制自己類別的列印方式就在類別上定義 __str__()。注意 str() 產生的是展示文字,不是 JSON 或 CSV。見 Python 中與 tostring() 等效的操作。

如何替換特定索引處的一個字元?

你不能向字串裡賦值——text[2] = "m" 會拋出 TypeError,因為字串不可變。改為建立替換結果:在該位置前後切片,text[:2] + "m" + text[3:],或先轉成列表、在索引處賦值,再用 "".join(...) 重新拼接。兩種方法都回傳新字串且不觸碰原字串;索引來自使用者輸入時,要用 len(text) 對它做校驗。在 Python 中的索引處替換字串中的字元 展示了兩種方法。

全部 Python 字串指南

基礎

轉換

清理與刪除

查找、檢查與計數

大小寫、比較與填充

格式化與替換

更多字串文章