W
e
l
c
o
m
e
: )

split 详解

不指定分隔符(即 str.split())时,默认使用任意的空白字符(Whitespace) 作为分隔符,并且会:

  1. 合并连续的分隔符(将多个空格/制表符视为一个分隔符)。
  2. 自动去除结果中的前导和尾随空字符串

1 默认行为详解

1.1 匹配规则:任意 Unicode 空白字符

默认情况下,分隔符不仅仅是 " "(空格),而是涵盖 Python 定义的所有 Unicode 空白字符,包括但不限于:

  • 空格
  • 制表符 \t
  • 换行符 \n
  • 回车符 \r
  • 换页符 \f
  • 垂直制表符 \v

可以通过 string.whitespace 查看完整的空白字符集合:

# ==============查看完整的空白字符集合==============
import string

print(repr(string.whitespace))  # ' \t\n\r\x0b\x0c'

1.2 对比演示:split() vs split(' ')

这是最容易混淆的地方,请观察以下代码差异:

# ==============对比演示:split() vs split(' ')==============
text = "Hello   World\tPython"  # 包含 3 个空格和 1 个制表符

# 默认行为:连续空白视为一个分隔符,不留空串
result_default = text.split()
print(result_default)  # ['Hello', 'World', 'Python']

# 指定空格 ' ':严格按单个空格切分,会产生空字符串
result_single_space = text.split(' ')
print(result_single_space)  # ['Hello', '', '', 'World\tPython']

# 指定空白正则(模拟默认行为,但不完全相同):
import re

result_regex = re.split(r'\s+', text.strip())
print(result_regex)  # ['Hello', 'World', 'Python']

images/split_详解/file-20260418144807600.png

1.3 去除首尾空字符串的特性

由于默认模式会自动去除前导和尾随的空白,你不需要先调用 strip()

# ==============去除首尾空字符串的特性==============
text_with_padding = "   A B C   "

# 默认 split:直接得到干净的列表
print(text_with_padding.split())  # ['A', 'B', 'C']

# 指定空格 split:首尾会出现空字符串
print(text_with_padding.split(' '))  # ['', '', '', 'A', 'B', 'C', '', '', '']

images/split_详解/file-20260418145040030.png

2 特殊场景:分割空字符串或全空白字符串

输入字符串 s.split() 结果 s.split(' ') 结果
"" (空串) [] ['']
" " (多个空格) [] ['', '', '', '']

3 参数对比速查表

行为特征 str.split() 无参数 str.split(sep) 指定分隔符
分隔符定义 任意连续的 Unicode 空白字符 严格按 sep 字符串切分
连续分隔符处理 视为一个整体(合并) 保留空字符串
首尾空白处理 自动去除(不产生空串) 保留(可能产生空串)
返回空列表的情况 字符串为 "" 或全空白时 仅当 maxsplit=-1 且 sep 未匹配时,视情况而定

3.1 最佳实践建议

  1. 处理用户输入的自然语言文本:优先使用无参 split(),它能优雅处理用户多打的空格、换行等不规范输入。

    user_input = "苹果 香蕉  橙子"
    items = user_input.split()  # 正确返回 3 个元素
    
  2. 解析严格的 CSV 或固定格式数据:务必指定分隔符,因为空字段往往具有特定含义。

    csv_line = "John,,Doe"
    fields = csv_line.split(',')  # 保留空字符串以对齐列位置
    
  3. 需要限制分割次数:无论哪种模式,都可以使用 maxsplit 参数。

    log = "ERROR 2026-04-18 内存不足"
    level, msg = log.split(maxsplit=1)  # ['ERROR', '2026-04-18 内存不足']
    
posted @ 2026-04-18 14:56  挖掘鱼  阅读(7)  评论(0)    收藏  举报