本文 AI 產出,尚未審核

Python 課程 – 資料結構:字串(str)

主題:字串方法(split, join, strip, replace, find, format, f‑string


簡介

Python 中,字串是最常見的資料型別之一,幾乎每一個程式都會與文字資料打交道。
無論是讀取檔案、解析網路回傳的 JSON、或是產生使用者介面的訊息,都離不開對字串的切割、合併、清理與格式化。

因此,熟練掌握 Python 內建的字串方法,不僅能讓程式碼更簡潔、可讀,還能大幅提升開發效率與除錯的便利性。本文將針對 splitjoinstripreplacefindformatf‑string 這七個最常用的字串操作,逐一說明概念、提供實作範例,並討論常見陷阱與最佳實踐,讓讀者能在實務專案中即學即用。


核心概念

1. split() – 把字串切成列表

split(sep=None, maxsplit=-1) 會依照 分隔符sep)將字串切割成多個子字串,回傳 list

  • sepNone 時,會以任意連續的空白字元(空格、換行、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(字面值插值) – 最直覺的字串格式化

在字串前加上 fF,即可在大括號 {} 內直接放入 變數運算式,或呼叫函式,執行時會自動轉換為字串。

# 範例 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 中引用。

實際應用場景

  1. 日誌(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 可直接把時間格式化、變數嵌入,讓日誌訊息一目了然。

  2. CSV 檔案讀寫

    # 讀取 CSV
    line = "2023-11-20,台北,100"
    date, city, amount = line.split(',')
    # 寫入 CSV
    output = ','.join([date, city, str(int(amount) * 2)])
    

    splitjoin 配合,可快速完成欄位的切割與重組。

  3. 網路爬蟲的文字清理

    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
    

    結合 stripreplacesplit 與正則表達式,能快速抽取所需資訊。

  4. 多國語系訊息模板

    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 的關鍵字參數讓不同語系的模板維護更方便。


總結

字串是程式設計中最基礎、同時也是最具挑戰性的資料型別。
透過 splitjoinstripreplacefindformatf‑string,我們可以:

  • 快速切割與重組 資料(split / join
  • 清理與正規化 使用者輸入或外部來源的雜訊(strip / replace
  • 精準定位 子字串位置,支援條件判斷(find / index
  • 彈性呈現 文字資訊,從舊式 format 到現代的 f‑string,提升可讀性與效能

在實務開發中,善用上述方法搭配 例外處理測試,即可寫出既簡潔又可靠的程式碼。希望本篇教學能幫助你在日常專案裡,更自信地處理各種文字資料,讓 Python 的威力發揮到最大!祝學習愉快,程式寫得順利 🚀