本頁內容
Python 字串:轉換、清理、查找與格式化
字串是你在 Python 中最常接觸的資料型別:使用者輸入、檔案內容、網頁和 CSV 的每一列,都是以文字形式到達的。它們很容易被低估,因為 Python 字串是不可變的——沒有任何方法能就地修改它,每次操作都會回傳一個新字串。本頁將 DelftStack 的全部 115 篇字串指南按你要做的工作組織起來,沿著四條任務線展開:把文字轉換為其他型別再轉回來、清除不屬於這裡的字元、查找並檢查字串裡有什麼,以及為輸出格式化或替換文字。
字串學習路徑
先用五分鐘掌握基礎:字串如何建立、如何索引和切片,以及為什麼不可變意味著你必須始終保留回傳值。接著學習查找與清理——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 一節。
- 如何在 Python 中將字串轉換為列表 — 當家指南:按字元用
list(),按單詞和欄位用split(),字面文字用ast.literal_eval()——絕不要對不受控的輸入用eval()。 - 在 Python 中將元組轉換為字串 —
str()保留元組的結構,join()給出乾淨的帶分隔結果,按元素逐個str()的產生器則能處理混合型別。 - 在 Python 中將字典轉換為字串 — 四條途徑:手寫迴圈、
str()、用於交換的json.dumps(),以及讓巢狀更易讀的pprint.pformat()。 - Python 中與 tostring() 等效的操作 — Python 沒有
toString():單個值用str(),多個值用join(),訊息用 f 字串,自己的類別用__str__()。 - 在 Python 中把字串列表轉換為整數 — 同一個轉換的四種寫法:推導式、
map(int, ...)、顯式迴圈,以及面向大資料集的 NumPy。 - 在 Python 中將 Bytearray 轉換為字串 — 說明為什麼
bytes()會留下一個b'...'的 repr,而bytearray.decode()回傳真正的文字。 - 在 Python 中將字串轉換為二進位制 — 把用
ord()得到的按碼點二進位,與用帶08b補零的bytearray()得到的按編碼位元組二進位區分開。 - 在 Python 中將字串轉換為布林值 — 從陷阱講起——
bool("False")是True——然後建立一個顯式的詞元解析器,遇到未知拼寫就拋錯。
清理與刪除:去掉不屬於這裡的東西
清理是這個集群的主場:抓取的頁面、匯出檔案和使用者輸入到達時都帶著從未被邀請的字元。按污垢的形態來選:一個已知的子字串用 replace(),一整組字元一次性處理用帶轉換表的 translate(),污垢是模式而非字面量時用正規表示式。
- 在 Python 中從字串中刪除 xa0 的方法 — 對付不可見不換行空格的兩招:用
unicodedata.normalize("NFKD", ...)分解,以及直接replace("\xa0", " ")。 - 在 Python 中從字串中刪除逗號 — 刪除每個逗號用
replace(",", ""),只刪第一個用count參數,做模式處理用re.sub()。 - 如何在 Python 中從一個字串中刪除標點符號 — 全套工具:對
string.punctuation過濾、用正規表示式[^\w\s]替換,以及用maketrans()建立的快速str.translate()轉換表。 - 在 Python 中從字串中刪除引號 —
replace()清除所有位置的引號;strip('"')只修剪首尾的那一對,內部引號不受影響。 - 在 Python 中刪除字串中的特殊字元 — 先定義什麼叫「特殊」,再分別用
isalnum()過濾、translate()字元集,或只匹配 ASCII 的正規表示式。 - 在 Python 中從字串中刪除換行符 \n — 刪除換行用
replace(),把多行以單個空格重新拼接用split()加join(),空白混雜時用正規表示式。 - 如何在 Python 中刪除字串中的最後一個字元 — 切片搞定:
s[:-1]去掉最後一個字元,負索引還能推廣到最後三個字元。
查找、檢查與計數
查找是這個集群最大的未滿足需求:讀者知道自己想要哪個字元,需要的是它的位置、它的數量,或一個是與否的答案。把分工理清——in 回答有沒有,find() 回答第一個在哪裡,index() 回答在哪裡並在找不到時大聲報錯,count() 回答有多少個。
- 在 Python 中的字串中查詢字元 — 第一個匹配用
find(),最後一個用rfind(),缺失應當拋錯時用index(),要全部索引則用enumerate()迴圈。 - 在 Python 中計算字串中字元的出現次數 — 數單個字元用
str.count(),連同其不重疊子字串的計數規則;需要數每個字元時用collections.Counter。 - 在 Python 中檢查字串是否包含單詞 — 簡單測試用
in,並注意"is" in "This"為真;整詞匹配重要時,用帶\b單詞邊界的正規表示式。 - 在 Python 中檢查變數是否為字串 — 預設用
isinstance(value, str),更嚴格的type()比較會漏掉子類別,另有 try-except 的變體寫法。 - 如何在 Python 中使用 if 判斷字串 — 用
==、in成員判斷和大小寫正規化比較來構造條件;is檢查的是身分,不是文字。 - Python 查詢字串中的所有出現 — 快速求總數用帶邊界的
count(),回傳全部索引用基於startswith()的推導式。
大小寫、比較與填充
大小寫是比較悄悄出錯的地方:Python 按 Unicode 碼點比較,所以大小寫和特殊字母都算數。比較前先正規化——普通文字用 lower() 或 upper(),需要讓 Unicode 配對相等時用 casefold()——展示時再用 ljust()、rjust()、center() 或 zfill() 填充。
- Python 中不區分大小寫的字串比較 — 先用
lower()或upper()把兩邊正規化,再給出 Unicode 層面的理由,說明casefold()為何能讓straße與STRASSE相等。 - 在 Python 中用空格填充字串 — 全套方法:
ljust()、rjust()、帶填充字元的center(),外加用於對齊輸出的%、format()和 f 字串等價寫法。 - 在 Python 中比較字串 — 運算子參考:相等用
==和!=,字典序用<和>,順序由第一個不同的碼點決定。 - 在 Python 中逐字元比較兩個字串 — 用
zip()把字元配對並統計相同位置的數量,顯式處理None輸入和長度不等的情形。
格式化與替換
對新程式碼來說,格式化就是 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 字串指南
基礎
- 在 Python 中複製字串
- 在 Python 中重複字串 N 次
- 在 Python 中建立一個多行字串
- 在 Python 中迴圈遍歷字串
- How to Append One String to Another in Python
- 在 Python 中連線字串和整數值
- How to Add Character to String in Python
- Python 中的 String Builder 等效
- How to Insert String Into a String in Python
- How to Fix String Indices Must Be Integers Error in Python
轉換
- 如何在 Python 中將字串轉換為列表
- 在 Python 中將元組轉換為字串
- 在 Python 中把字串列表轉換為整數
- 在 Python 中將 Bytearray 轉換為字串
- 在 Python 中將字典轉換為字串
- Python 中與 tostring() 等效的操作
- 如何在 Python 中將字串轉換為浮點或整數
- 如何在 Python 中將浮點數轉換為字符串
- 在 Python 中將字串轉換為 Unicode
- 在 Python 中將字串轉換為二進位制
- 在 Python 中將字串轉換為布林值
- 如何在 Python 中將整數轉換為字串
- 在 Python 中將浮點數格式化為字串
- 在 Python 中將列表轉換為逗號分隔的字串
- 如何在 Python 中將列表轉換為字串
- 在 Python 中連線字串列表
- 在 Python 中將字串拆分為 Char 陣列
- How to Parse String to List in Python
- 如何在 Python 中基於多個定界符分割字串
- 在 Python 中根據空格拆分字串
- 在 Python 中將字串分成兩半
- 在 Python 中將字串轉換為 ASCII 值
- 在 Python 中將 Unicode 字元轉換為 ASCII 字串
- How to Convert String to Double in Python
- 在 Python 中將字串轉換為小數
- 如何在 Python 2 和 Python 3 中將位元組轉換為字串
- How to Convert String to Bytes in Python
- 在 Python 中將日期時間轉換為字串
- Python 如何將字串轉換為時間日期 datetime 格式
- 在 Python 中將字串轉換為變數名
- Python JSON 字串化
- 在 Python 中將字串轉換為浮點值
- 在 Python 中將字串轉換為整數
清理與刪除
- 在 Python 中從字串中刪除 xa0 的方法
- 在 Python 中從字串中刪除逗號
- 如何在 Python 中從一個字串中刪除標點符號
- 在 Python 中從字串中刪除引號
- 在 Python 中刪除字串中的特殊字元
- 在 Python 中從字串中刪除換行符 \n
- 如何在 Python 中刪除字串中的最後一個字元
- 在 Python 中從字串中刪除某些字元
- 在 Python 中從字串中刪除數字
- 在 Python 中從字串中刪除換行符
- 在 Python 中刪除字串中的第一個字元
- How to Remove Parentheses From String in Python
- 如何在 Python 中從字串中刪除子字串
- Python 如何去掉字串中的空格/空白符
查找、檢查與計數
- 在 Python 中檢查字串是否包含單詞
- 在 Python 中檢查變數是否為字串
- 如何在 Python 中檢查字串是否包含數字
- 在 Python 中檢查字串是否為整數
- 在 Python 中的字串中查詢字元
- 在 Python 中計算字串中字元的出現次數
- 如何在 Python 中使用 if 判斷字串
- Python 查詢字串中的所有出現
- 在 Python 中檢查字串是否為數字
- 如何在 Python 中檢查字串是否包含子字串
- How to Check if a Word Exists in a String in Python
- 在 Python 字串中查詢字元的所有索引
- 從 Python 中的字串中提取子字串
- 如何在 Python 中從字串中提取數字
- 在 Python 中計算字串中的單詞
- How to Count Vowels in a String Using Python
- Python 中最長的公共子字串
- 在 Python 中查詢列表中的字串
- How to Match Fuzzy String in Python
- Python 檢查列表是否包含字串
- Python 在檔案中查詢字串
- 如何以 Pythonic 方式檢查字符串是否為空
大小寫、比較與填充
- Python 中不區分大小寫的字串比較
- 在 Python 中用空格填充字串
- 在 Python 中比較字串
- 在 Python 中逐字元比較兩個字串
- 在 Python 中用零填充字串
- How to Captilize String in Python
- Python 中的右對齊字串
- How to Sort String Alphabetically in Python
格式化與替換
- The sprintf() Function in Python
- 在 Python 中替換字串中的字元
- Python 字串格式中 %s 和 %d 的區別
- 在 Python 中的索引處替換字串中的字元
- Python 中的字串插值
- How to Solve the TypeError: Not All Arguments Converted During String Formatting in Python
- 修復 TypeError:沒有足夠的引數導致 Python 中的格式字串錯誤
- How to Fix TypeError: Non-Empty Format String Passed to Object.format in Python
- 使用 Python 替換檔案中的字串
- 在 Python 中列印字串和變數
更多字串文章
- 加密 Python 字串
- 在 Python 中根據函式的字串名稱呼叫函式
- B in Front of String in Python
- Python 中的原始字串
- Python 中的原始字串和 Unicode 字串
- 在 Python 中反轉字串
- Python 中字串的排列
- 在 Python 中將檔案讀取為字串
- 在 Python 中向檔案寫入字串
- How to Print String to Text File Using Python
- 使用 Python 套接字傳送字串
- How to Quote Backslash in String in Python
- How to Fix Error - EOL While Scanning String Literal in Python
- How to Fix TypeError: str Returned Non-String but Printing Output
- 在 Python 中訪問文件字串
- Python 中最常見的 Docstring 模式
- 如何在 Python 中對兩個字符串執行按位異或
- 在 Python 中生成隨機字串
以上就是這個字串集群的全部內容。想要更全的地圖——列表、字典、檔案、日期和錯誤——請回到 Python 支柱,在那裡 Dictionary 組和 List 組與本頁展開的 Strings 組並列。