split() 是 Python 字串最核心的分割方法,將字串依指定分隔符切分為子字串列表。支援自訂分隔符、限制最大分割次數、預設按任意空白字元分割(並自動忽略連續空白)。是資料解析、文字處理、命令列參數分析的基石工具。
str.split(sep=None, maxsplit=-1)
回傳 字串列表,包含所有分割出的子字串。
#!/usr/bin/python
str = "Line1-abcdef nLine2-abc nLine4-abcd"
print(str.split())
print(str.split(' ', 1))
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', 'nLine2-abc nLine4-abcd']
# 連續空白視為單一分隔符
print("a b c".split()) # ['a', 'b', 'c']
# 首尾空白自動忽略
print(" a b ".split()) # ['a', 'b']
# 所有空白字元:空格、tab、換行、回車
print("a\tb\nc\r d".split()) # ['a', 'b', 'c', 'd']
# 空字串或純空白 → 空列表
print("".split()) # []
print(" ".split()) # []
# 單一字元
print("a,b,c".split(',')) # ['a', 'b', 'c']
# 多字元分隔符
print("a::b::c".split('::')) # ['a', 'b', 'c']
# 分隔符不存在 → 原字串成單一元素列表
print("abc".split(',')) # ['abc']
# 連續分隔符產生空字串元素(與預設行為不同!)
print("a,,b".split(',')) # ['a', '', 'b']
print(",a,".split(',')) # ['', 'a', '']
# 只分割前 1 次
print("a,b,c,d".split(',', 1)) # ['a', 'b,c,d']
# 只分割前 2 次
print("a,b,c,d".split(',', 2)) # ['a', 'b', 'c,d']
# 從右側限制分割 → rsplit()
print("a,b,c,d".rsplit(',', 1)) # ['a,b,c', 'd']
# maxsplit=0 → 不分割
print("a,b,c".split(',', 0)) # ['a,b,c']
| 方法 | 方向 | 分隔符 | 最大分割 | 適用場景 |
|---|---|---|---|---|
| split(sep, maxsplit) | 左→右 | 字串/None(空白) | 支援 | 通用分割、CSV 解析、參數拆解 |
| rsplit(sep, maxsplit) | 右→左 | 字串/None(空白) | 支援 | 從右側限制分割、路徑處理 |
| splitlines(keepends) | 行邊界 | 所有換行符 | 否 | 多行文字、跨平台換行 |
| re.split(pattern, maxsplit) | 左→右 | 正則表達式 | 支援 | 複雜模式、多種分隔符、條件分割 |
line = 'apple,banana,"orange,juice",grape'
# 簡單 split 會錯誤切分引號內逗號
# 正確用 csv 模組
import csv
reader = csv.reader([line])
print(next(reader)) # ['apple', 'banana', 'orange,juice', 'grape']
cmd = 'python script.py --name "John Doe" --age 30'
# 簡單 split 會切破帶空格的參數
import shlex
print(shlex.split(cmd))
# ['python', 'script.py', '--name', 'John Doe', '--age', '30']
path = "/home/user/documents/file.txt"
# 取得檔名
filename = path.split('/')[-1] # 'file.txt'
# 取得目錄
directory = '/'.join(path.split('/')[:-1]) # '/home/user/documents'
# 正確跨平台做法
from pathlib import Path
p = Path(path)
print(p.name) # file.txt
print(p.parent) # /home/user/documents
def parse_kv_pairs(text, sep=';', kv_sep='='):
"""解析 'a=1;b=2;c=3' 格式"""
result = {}
for pair in text.split(sep):
if kv_sep in pair:
k, v = pair.split(kv_sep, 1) # maxsplit=1 只分第一個 =
result[k.strip()] = v.strip()
return result
print(parse_kv_pairs("name=John;age=30;city=New York"))
# {'name': 'John', 'age': '30', 'city': 'New York'}
import re
# 保留分隔符於結果中
text = "a,b;c,d"
# 分隔符為 , 或 ;
print(re.split(r'([,;])', text)) # ['a', ',', 'b', ';', 'c', ',', 'd']
| 陷阱 | 說明 | 正確做法 |
|---|---|---|
| 預設分割 vs 指定空格分割 | split() 忽略連續空白;split(' ') 保留空字串 | 預設用 split(),指定分隔符用 split(sep) |
| 連續分隔符產生空字串 | "a,,b".split(',') → ['a', '', 'b'] | 後續處理過濾:[x for x in s.split(',') if x] |
| maxsplit 計算邏輯 | maxsplit=1 → 2 個元素;maxsplit=n → n+1 個元素 | 記住列表長度 = maxsplit + 1 |
| 分隔符為空字串 | split('') → ValueError | 不可用空字串分隔,單字元用 list(s) |
| 大小寫敏感 | 分隔符大小寫敏感 | 需統一大小寫或用 re.split(flags=re.I) |
s = "a,b,c,d"
s.split(',') # ['a', 'b', 'c', 'd']
s.split(',', 2) # ['a', 'b', 'c,d']
s.rsplit(',', 1) # ['a,b,c', 'd']
s.split(',', 0) # ['a,b,c,d']
s.split() # ['a,b,c,d'] 無空白不分割
" a b ".split() # ['a', 'b']
" a b ".split(' ') # ['', 'a', 'b', '']
split(sep=None, maxsplit=-1) 是字串分割的核心方法:預設按空白智能分割(忽略連續/首尾)、指定分隔符精確切分、maxsplit 限制分割次數。核心優勢:語法簡潔、預設行為智能、效能極佳。掌握 sep=None 與 sep=' ' 差異、maxsplit 計算邏輯、rsplit() 反向分割、splitlines() 行分割、re.split() 正則分割,能靈活應對 CSV 解析、參數處理、路徑拆解、文字分析等各類實務場景。