Python 課程 – 資料結構:字串(str)
主題:字串方法(split, join, strip, replace, find, format, f‑string)
簡介
在 Python 中,字串是最常見的資料型別之一,幾乎每一個程式都會與文字資料打交道。
無論是讀取檔案、解析網路回傳的 JSON、或是產生使用者介面的訊息,都離不開對字串的切割、合併、清理與格式化。
因此,熟練掌握 Python 內建的字串方法,不僅能讓程式碼更簡潔、可讀,還能大幅提升開發效率與除錯的便利性。本文將針對 split、join、strip、replace、find、format 與 f‑string 這七個最常用的字串操作,逐一說明概念、提供實作範例,並討論常見陷阱與最佳實踐,讓讀者能在實務專案中即學即用。
核心概念
1. split() – 把字串切成列表
split(sep=None, maxsplit=-1) 會依照 分隔符(sep)將字串切割成多個子字串,回傳 list。
sep為None時,會以任意連續的空白字元(空格、換行、Tab)為分界。maxsplit限制切割次數,超過的部分會保留在最後一個元素中。
# 範例 1:以空白切割
sentence = "Python 是一個易學且功能強大的語言"
words = sentence.split()
print(words) # ['Python', '是', '一個易學且功能強大的語言']
# 範例 2:指定分隔符
data = "2023-11-20,台北,100"
date, city, value = data.split(',')
print(date, city, value) # 2023-11-20 台北 100
# 範例 3:限制切割次數
path = "/usr/local/bin/python"
parts = path.split('/', maxsplit=2)
print(parts) # ['', 'usr', 'local/bin/python']
小技巧:若字串可能有前後多餘的空白,先使用
strip()再split()可以避免產生空字串元素。
2. join() – 把列表合併成字串
separator.join(iterable) 會把 可迭代物件(如 list、tuple)中的元素以指定的 分隔符 連接起來,回傳 字串。
# 範例 4:使用逗號合併
items = ['蘋果', '香蕉', '橘子']
csv = ','.join(items)
print(csv) # 蘋果,香蕉,橘子
# 範例 5:建立檔案路徑
folders = ['home', 'user', 'documents']
path = '/'.join(folders)
print(path) # home/user/documents
注意:
join()的參數必須全是字串,若有非字串類型會拋出TypeError,此時可先使用map(str, iterable)轉型。
3. strip()、lstrip()、rstrip() – 去除頭尾雜訊
strip([chars]) 會移除字串兩端(左、右)出現的 指定字符,若未給參數則預設移除空白、換行與 Tab。
# 範例 6:去除兩側空白
raw = " hello world \n"
clean = raw.strip()
print(repr(clean)) # 'hello world'
# 範例 7:去除特定符號
url = "///example.com///"
domain = url.strip('/')
print(domain) # example.com
最佳實踐:在處理使用者輸入或檔案讀入時,先
strip()再進行後續的驗證或比對,可避免因隱藏空白而產生錯誤。
4. replace() – 替換子字串
replace(old, new, count=-1) 會把字串中 所有(或前 count 個)出現的 old 替換成 new,回傳 新字串(原字串不變)。
# 範例 8:簡單替換
msg = "I love Python. Python is awesome!"
new_msg = msg.replace("Python", "Java")
print(new_msg) # I love Java. Java is awesome!
# 範例 9:限制替換次數
text = "one two three two one"
limited = text.replace("two", "2", 1)
print(limited) # one 2 three two one
陷阱:若
old為空字串 ("") 會在每個字符之間插入new,請務必確認參數的正確性。
5. find() / index() – 找出子字串位置
find(sub, start=0, end=len(s))回傳 子字串第一次出現的索引,若找不到則回傳-1。index()與find()功能相同,但若找不到會拋出ValueError,適合需要確保子字串必定存在的情況。
# 範例 10:使用 find()
sentence = "Python is fun, and Python is powerful."
pos = sentence.find("Python")
print(pos) # 0
# 範例 11:使用 index() 捕捉錯誤
try:
sentence.index("Java")
except ValueError:
print("找不到目標字串")
實務建議:在需要判斷是否存在時,使用
if s.find(sub) != -1:或直接if sub in s:會更直觀。
6. format() – 位置與關鍵字佔位
"文字 {0} {name}".format(value, name="Alice") 允許 位置參數、關鍵字參數,以及 格式化說明(寬度、對齊、小數位等)。
# 範例 12:基本使用
msg = "Hello, {}!".format("World")
print(msg) # Hello, World!
# 範例 13:關鍵字與對齊
info = "Name: {name:<10} Age: {age:>3}".format(name="Bob", age=7)
print(info) # Name: Bob Age: 7
# 範例 14:數值格式化
price = "Total: ${:,.2f}".format(1234567.89)
print(price) # Total: $1,234,567.89
注意:
format()每次呼叫都會產生新的字串,若在大量迭代中頻繁使用,可能會影響效能,此時可考慮 f‑string(Python 3.6+)。
7. f‑string(字面值插值) – 最直覺的字串格式化
在字串前加上 f 或 F,即可在大括號 {} 內直接放入 變數、運算式,或呼叫函式,執行時會自動轉換為字串。
# 範例 15:簡潔插值
name = "Alice"
age = 30
msg = f"My name is {name}, age {age}."
print(msg) # My name is Alice, age 30.
# 範例 16:內嵌運算與函式
import math
radius = 5
area_msg = f"The area of a circle (r={radius}) is {math.pi * radius**2:.2f}"
print(area_msg) # The area of a circle (r=5) is 78.54
# 範例 17:條件表達式
value = 42
status = f"{value} is {'even' if value % 2 == 0 else 'odd'}"
print(status) # 42 is even
- 優點:可讀性佳、執行速度快、支援直接寫表達式。
- 限制:只能在 Python 3.6 以上 使用,且大括號內不能直接放多行程式碼。
常見陷阱與最佳實踐
| 方法 | 常見陷阱 | 最佳實踐 |
|---|---|---|
split |
忽略連續分隔符會產生空字串(例如 ",,".split(",") → ['', '', '']) |
使用 filter(None, ...) 或 split(..., maxsplit) 排除不必要的空元素。 |
join |
迭代物件含非字串元素會拋 TypeError |
先 map(str, iterable),或使用列表生成式 str(x) for x in iterable。 |
strip |
預設只移除空白,若需移除其他符號需自行指定 | 針對特定清理需求,如 strip('.,;'),一次處理多種雜訊。 |
replace |
替換空字串會在每個字符之間插入新字串 | 確認 old 不為空字串,或使用正則表達式 re.sub 處理更複雜情況。 |
find / index |
find 回傳 -1,若直接使用結果作索引會產生 IndexError |
使用 if sub in s: 或 try/except 包住 index()。 |
format |
大量使用時會產生大量臨時字串,影響記憶體 | 在迴圈內盡量改用 f‑string 或預先組合模板。 |
| f‑string | 大括號內放入過長的運算式降低可讀性 | 把複雜運算抽成變數或函式,再在 f‑string 中引用。 |
實際應用場景
日誌(logging)格式化
import logging logger = logging.getLogger(__name__) user = "admin" action = "login" logger.info(f"[{user}] performed {action} at {datetime.now():%Y-%m-%d %H:%M:%S}")使用 f‑string 可直接把時間格式化、變數嵌入,讓日誌訊息一目了然。
CSV 檔案讀寫
# 讀取 CSV line = "2023-11-20,台北,100" date, city, amount = line.split(',') # 寫入 CSV output = ','.join([date, city, str(int(amount) * 2)])split與join配合,可快速完成欄位的切割與重組。網路爬蟲的文字清理
raw_html = "<div>\n Price: $1,299.99 </div>" # 移除 HTML 標籤與多餘空白 import re text = re.sub(r'<[^>]+>', '', raw_html).strip() price = text.split('$')[1].replace(',', '') print(price) # 1299.99結合
strip、replace、split與正則表達式,能快速抽取所需資訊。多國語系訊息模板
tmpl = { "en": "Hello, {name}! You have {cnt} new messages.", "zh": "嗨,{name}!您有 {cnt} 條新訊息。" } def greet(lang, name, cnt): return tmpl[lang].format(name=name, cnt=cnt) print(greet("zh", "小明", 5))format的關鍵字參數讓不同語系的模板維護更方便。
總結
字串是程式設計中最基礎、同時也是最具挑戰性的資料型別。
透過 split、join、strip、replace、find、format 與 f‑string,我們可以:
- 快速切割與重組 資料(
split/join) - 清理與正規化 使用者輸入或外部來源的雜訊(
strip/replace) - 精準定位 子字串位置,支援條件判斷(
find/index) - 彈性呈現 文字資訊,從舊式
format到現代的 f‑string,提升可讀性與效能
在實務開發中,善用上述方法搭配 例外處理 與 測試,即可寫出既簡潔又可靠的程式碼。希望本篇教學能幫助你在日常專案裡,更自信地處理各種文字資料,讓 Python 的威力發揮到最大!祝學習愉快,程式寫得順利 🚀