跳到主要內容

Day 9 字串處理

Day 9 字串處理

引言

前幾天我們學會了變數、運算子、條件判斷、迴圈與函式,這些都是寫程式的核心基礎。在實際應用中,字串(文字資料)佔了非常大的比例:使用者輸入的姓名、檔案路徑、從網路讀取的內容、CSV 裡的欄位……幾乎無所不在。因此,熟悉 Python 的字串處理工具,能讓你在處理真實世界的資料時事半功倍。

這篇文章會帶你認識 Python 字串處理的常用技巧:首先是切片的詳細語法,包括正索引、負索引與步進;接著介紹幾個最常用的字串方法(split、join、replace、strip、upper、lower 等);然後說明 f-string 格式化的強大之處;最後用正規表達式入門,讓你具備處理複雜文字模式的能力。

切片:精準切割字串

字串切片(slicing)的語法是 s[start:stop:step],其中 start 是起始索引(包含)、stop 是結束索引(不包含)、step 是間隔。切片會回傳一個新的字串,不會修改原本的字串。

s = "Python programming"

print(s[0:6])      # Python,從 0 取到 6 之前
print(s[7:])       # programming,從 7 取到結尾
print(s[:6])       # Python,從開頭取到 6 之前
print(s[::2])      # Pto rgamn(每隔一個字元取一次)
print(s[::-1])     # 反轉字串:gnimmargorp nohtyP

切片也可以使用負索引,-1 代表最後一個字元、-2 代表倒數第二個,依此類推。[::-1] 是反轉字串的慣用寫法,這個技巧在判斷迴文、面試題中也很常見。

常用字串方法

Python 字串內建許多方法,可以快速完成常見的處理工作。以下是幾個最常用的方法,搭配簡短範例說明。

# split:把字串切成串列
text = "apple,banana,cherry"
fruits = text.split(",")
print(fruits)  # ['apple', 'banana', 'cherry']

# join:把串列合併成字串
words = ["Python", "is", "fun"]
sentence = " ".join(words)
print(sentence)  # Python is fun

# replace:取代部分字串
msg = "I love Java"
print(msg.replace("Java", "Python"))  # I love Python

# strip:去除頭尾的空白字元
raw = "   hello   \n"
print(raw.strip())  # hello

# upper / lower:大小寫轉換
print("hello".upper())  # HELLO
print("WORLD".lower())  # world

字串方法非常多,例如 startswith()、endswith() 用來檢查開頭或結尾是否符合特定字串;find() 用來找子字串的位置;count() 用來計算出現次數。這些方法都不會修改原字串,而是回傳新的結果,這點和串列的「原地修改」不同,寫程式時要特別注意。

f-string 格式化

f-string 是 Python 3.6 之後加入的格式化寫法,能讓字串與變數的組合變得非常直覺。它的語法是在字串前面加 f,然後用 {變數} 或 {運算式} 把值嵌入。

name = "Alice"
age = 25
print(f"我是 {name},今年 {age} 歲")  # 我是 Alice,今年 25 歲

# 可以放運算式
print(f"明年我會 {age + 1} 歲")

# 格式規範::2d 表示寬度為 2 的整數
for i in range(1, 6):
    print(f"編號:{i:02d}")  # 編號:01、02、03、04、05

# 控制小數位數
pi = 3.14159
print(f"圓周率約 {pi:.2f}")  # 圓周率約 3.14

f-string 不只可以嵌入變數,也能直接放運算式、函式呼叫甚至條件判斷(用三元運算式)。相較於早期的 % 格式化或 str.format(),f-string 可讀性更高,也是目前社群最推薦的寫法。

正規表達式入門

當需要處理的文字模式比較複雜時(例如「找出所有 email」、「把電話號碼中間四碼遮起來」),單純的字串方法會顯得不足,這時候就可以用正規表達式(regular expression)。Python 透過內建的 re 模組支援正規表達式。

import re

text = "我的 email 是 alice@example.com,服務電話是 02-1234-5678"

# re.findall:找出所有符合模式的部分
emails = re.findall(r"[\w.+-]+@[\w.-]+", text)
print(emails)  # ['alice@example.com']

# re.sub:把符合模式的內容取代掉
masked = re.sub(r"\d{4}-\d{4}", "****-****", text)
print(masked)  # 我的 email 是 alice@example.com,服務電話是 02-****-****

正規表達式是一種「用字串描述字串模式」的語言,乍看之下像亂碼,但學會幾個基本符號後就會得心應手:

  • \d 匹配任一數字;\w 匹配字母、數字或底線;\s 匹配空白字元
  • + 表示前一個元素「出現一次以上」;* 表示「出現零次以上」;? 表示「出現零或一次」
  • [] 用來設定字元集合,例如 [a-z] 表示任一小寫字母

正規表達式的功能非常強大,但也容易變得難以閱讀。實務上建議先用簡單的寫法(例如 in 或 find())處理,無法解決時再考慮正規表達式。

字串常見陷阱

字串處理有一些新手常忽略的特性,認識後可以少踩一些坑。

字串是不可變的:所有字串方法都會「回傳新字串」,不會修改原字串。

s = "hello"
s.upper()             # 回傳 "HELLO",但 s 仍是 "hello"
print(s)              # hello
s = s.upper()         # 必須重新賦值才會生效
print(s)              # HELLO

使用 == 而非 is 比較字串:判斷字串內容是否相同時,請用 ==,不要用 is,因為 is 是比較是否為同一個物件,語意不同。

小心換行字元:從檔案或網路讀取的字串常帶有 \n(換行)或 \r(歸位字元)。可以用 strip() 或 replace() 處理,否則輸出時容易出現多餘空白。

字串編碼與 Unicode

在電腦裡,字串其實是一連串的數字,每個字元對應到一個編號。Python 3 的字串預設使用 Unicode,能直接處理中文、日文、emoji 等各種字元,這對台灣的開發者來說相當方便。

s = "你好,世界"
print(len(s))  # 5(5 個字元,不論中英文都算 1 個)

# ord() 取得 Unicode 編號,chr() 反查
print(ord("A"))   # 65
print(chr(65))    # A
print(ord("中"))  # 20013

# encode() 把字串轉成位元組,decode() 反向還原
b = s.encode("utf-8")
print(b)          # b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c'
print(b.decode("utf-8"))  # 你好,世界

處理檔案或網路資料時,最常見的編碼錯誤是 UnicodeDecodeError,通常是因為檔案編碼與你指定的編碼不一致。多數情況下,UTF-8 是最通用的選擇,無論是讀檔、寫檔或網路傳輸,預設用它通常都能順利執行。

實用範例:處理 CSV 風格的資料

把今天學到的工具組合起來,我們寫一個處理 CSV 風格字串的小範例。CSV 是資料處理最常見的格式之一,雖然有專門的 csv 模組可以處理,但了解背後原理仍然很有幫助。

# 假設的 CSV 內容
csv_text = "name,age,city\nAlice,25,Taipei\nBob,30,Kaohsiung\nCarol,28,Taichung"

# 用 split('\n') 切出每一列
lines = csv_text.split("\n")
print(lines)
# ['name,age,city', 'Alice,25,Taipei', 'Bob,30,Kaohsiung', 'Carol,28,Taichung']

# 用 split(',') 切出欄位
for line in lines:
    fields = line.split(",")
    print(fields)

這個範例把 split() 與 strip() 結合起來,把每一列解析成欄位串列。實務上若要處理真正的 CSV 檔案,建議改用內建的 csv 模組或 Pandas,可以省去處理引號、跳脫字元等複雜狀況。

常見字串場景與對應工具

把本章介紹的工具整理成一張速查表,能幫助你在遇到實際問題時快速想起合適的方法。

  • 想取出部分字串:用切片 s[start:stop:step]。
  • 想把字串切成多段:用 split(sep),預設以空白分隔。
  • 想把多段合併成一個字串:用 sep.join(parts)。
  • 想替換部分文字:用 replace(old, new);如果模式複雜則用 re.sub()。
  • 想去掉頭尾空白:用 strip()、lstrip() 或 rstrip()。
  • 想檢查是否包含特定子字串:用 in 運算子或 find()。
  • 想要格式化輸出:用 f-string 或 str.format()。

這張表不需要硬背,寫多了自然會記住。重要的是每次遇到字串問題時,先想一想「我到底想達成什麼」,再去查合適的方法。

字串效能的小提醒

字串是不可變的,這代表每次用 + 串接字串時,Python 都會建立一個新的字串物件。在小量資料時沒什麼影響,但當你在迴圈內反覆串接大量字串(例如數萬行)時,這個特性會讓效能明顯下降。這時候建議改用 join() 搭配串列,先把所有片段收進串列,最後再一次合併,會比逐次 + 串接快上好幾倍。

# 較慢:在迴圈中反覆使用 +
result = ""
for i in range(10000):
    result += str(i)

# 較快:先收集再 join
parts = []
for i in range(10000):
    parts.append(str(i))
result = "".join(parts)

這是 Python 字串處理中很常見的效能議題,特別是在處理日誌、大量使用者輸入、或生成報表時特別有用。養成「迴圈內不直接 += 字串」的好習慣,能讓程式在資料規模擴大時仍然保持高效。

結語

今天我們認識了 Python 字串處理的常用技巧:切片讓我們能精準切割字串;split、join、replace、strip 等方法處理日常需求;f-string 讓格式化變得直覺;正規表達式則讓我們能處理複雜的文字模式。這些工具組合起來,已經足以應付大部分的文字處理工作。

明天,我們會進入容器型別的進階操作。除了已經熟悉的串列、元組、字典、集合,我們會學到 Python 非常好用的「推導式」,以及能把多組資料配對起來的 enumerate() 與 zip(),讓程式碼寫得更簡潔、更具 Python 風格。

留言

這個網誌中的熱門文章

Day 2 變數與資料型別

Day 2 變數與資料型別 引言 寫程式的過程中,變數與資料型別是處理資料的基礎。變數是存放資料的容器,資料型別則決定這筆資料有哪些特性、可以進行哪些操作。學會定義變數、認識各種資料型別,是學好 Python 的關鍵一步。 這篇文章會帶你了解 Python 中變數的觀念、如何定義變數,以及常見的資料型別,包括整數、浮點數、字串、布林值,還有串列、元組、字典與集合等容器型別。我們也會介紹變數的命名規則與撰寫風格建議,以及如何用 type() 檢查資料型別。 什麼是變數?如何在 Python 中定義變數 變數是在程式執行時用來存放資料的名稱。透過定義變數,我們可以給一筆資料一個名字,並在程式的其他地方用這個名字取用該筆資料。在 Python 中,變數不需要事先宣告型別,因為 Python 是動態型別語言,變數的型別由指定給它的值決定。 定義變數的基本語法 在 Python 中定義變數非常簡單,只要用賦值符號 = 把值指定給變數即可。例如: x = 5 # 定義變數 x,並把整數 5 賦值給它 name = "Alice" # 定義變數 name,並把字串 "Alice" 賦值給它 在這裡,x 是一個變數,被賦予整數 5;name 是另一個變數,被賦予字串 "Alice"。 變數的更新與覆寫 變數的值可以修改,也就是說,我們可以在程式的不同地方給同一個變數新的值。例如: x = 10 # x 最初被賦予 10 x = 15 # x 的值現在被更新為 15 這樣就能依照需求,在程式執行過程中靈活調整變數的值。 Python 的動態型別系統 Python 和某些靜態型別語言不同,定義變數時不需要宣告型別。賦值時,Python 會根據值自動判斷變數的型別。例如: x = 5 # x 是整數 x = 3.14 # x 變成浮點數 x = "Hi" # x 變成字串 同一個變數在程式執行過程中可以存放不同型別的值,這是 Python 的彈性之一。 常見資料型別 在 Python 中,資料型別決定我們可以對變數進行哪些操作...

Day 1 Python 簡介與環境設定

Day 1 Python 簡介與環境設定 引言 在現在的科技環境裡,程式設計已經是一項重要技能。無論你是對資料科學有興趣、想成為開發者,或是想踏入人工智慧(AI)領域,學會寫程式都能明顯提升你的競爭力。在眾多程式語言中,Python 因為語法簡單、功能強大、應用範圍廣泛,成為許多人進入程式世界的第一選擇。這篇文章會帶你認識 Python 的背景與優勢,並一步步教你在不同系統上安裝與設定 Python 開發環境,最後寫出第一支 Python 程式。 為什麼選擇 Python? Python 是一種高階程式語言,由 Guido van Rossum 在 1991 年發布。Python 的設計哲學強調程式碼的可讀性,並用縮排來定義程式區塊,這點和許多使用大括號的語言不同。簡潔的語法讓它成為初學者的理想選擇;就算是經驗豐富的開發者,也能用它完成複雜的專案。 Python 的優勢如下: 簡單易學 :Python 的語法清楚、結構簡潔,初學者很快就能上手。和其他語言相比,學習曲線相對平緩,不需要先弄懂一堆複雜觀念,就能開始寫程式。 應用範圍廣泛 :從資料科學、網頁開發、人工智慧、機器學習、自動化測試到網路爬蟲,Python 都有大量開源函式庫與工具支援,而且在這些領域都扮演關鍵角色。 豐富的函式庫與框架 :Python 的函式庫生態系非常龐大。做資料分析有 NumPy、Pandas;開發網站有 Django、Flask;做深度學習有 TensorFlow、PyTorch。各種需求幾乎都能找到對應的套件,讓開發更有效率。 跨平台支援 :Python 支援 Windows、macOS、Linux 等作業系統,程式通常不需要太多修改就能跨平台執行,讓開發與部署更有彈性。 活躍的社群 :Python 擁有龐大的開發者社群。學習或開發上遇到問題,幾乎都能在社群與論壇(例如 Stack Overflow)找到答案,對初學者來說是很強的後盾,也能減少卡關時的挫折感。 Python 的應用領域 Python 的流行與強大功能,讓許多領域都開始大量使用它。以下是幾個常見的應用方向: 資料科學 :隨著大數據與人工智慧興起,資料科學大量使用 Python。NumPy、Pandas 與 Matplotlib 等工具能處理和分析龐...

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門 隨著人工智慧(AI)與深度學習(Deep Learning)快速發展,越來越多人對這些技術產生興趣。不論你是想踏入 AI 領域的初學者,還是已經有程式基礎的開發者,學好 Python 與深度學習框架(例如 PyTorch),都能為你打開更多可能。 為什麼選擇 Python? Python 已經是資料科學與人工智慧領域的首選語言。它的語法簡潔、容易上手,而且擁有龐大的生態系與大量開源函式庫。無論是資料處理、資料視覺化,還是建立機器學習與深度學習模型,Python 都能勝任。對想進入 AI 或資料科學領域的人來說,它幾乎是必備工具。 PyTorch 是什麼? PyTorch 是由 Meta(原 Facebook)AI 研究團隊開發的開源深度學習框架,以易用、靈活和動態計算圖著稱,是許多 AI 研究人員與開發者的首選。相較於其他框架,PyTorch 的寫法更貼近原生 Python,對初學者相對友善。無論是簡單的實驗,還是複雜的深度學習模型,PyTorch 都能提供強大的支援。 這個系列能帶給你什麼? 這個系列會從 Python 的基礎開始,帶你一步一步學習,最後能自己用 PyTorch 建立深度學習模型。即使你完全沒有寫過程式,也能跟著文章的節奏累積技能,理解 AI 與深度學習的核心觀念。 本系列涵蓋的主題 Python 基礎:從變數、條件判斷到函式與模組。 資料處理工具:用 NumPy 與 Pandas 有效率地操作資料。 資料視覺化:用 Matplotlib 與 Seaborn 把資料畫成圖表。 深度學習的數學基礎:線性代數、微積分與機率。 PyTorch 入門:理解張量、模型建構與 GPU 加速。 基礎深度學習模型:CNN 與 RNN 的實作應用。 深度學習專案實戰:從資料前處理到模型部署的端到端流程。 誰適合這個系列? 程式初學者 :如果你對 AI 充滿好奇,卻還沒寫過程式,系列的第一部分會帶你快速上手 Python,並幫助你理解深度學習的基本觀念。 資料科學愛好者 :如果你已經熟悉一些資料處理方法,進階部分會教你如何用 PyTorch 建構深度學習模型。 開發者與研究人員 :想更深入了...