杰瑞科技汇

Python re.split如何正确分割中文?

re.split() 是 Python re 模块中的一个强大函数,它使用正则表达式来指定分割符,这比 str.split() 方法要灵活得多,尤其适合处理复杂的分割场景。

Python re.split如何正确分割中文?-图1
(图片来源网络,侵删)

核心概念

re.split() 的基本语法是:

re.split(pattern, string, maxsplit=0, flags=0)
  • pattern: 正则表达式,用来匹配分割符。
  • string: 要分割的字符串。
  • maxsplit: 可选参数,表示最大分割次数,默认为 0,表示分割所有。
  • flags: 可选参数,控制正则表达式的匹配方式,如忽略大小写 re.IGNORECASE

关键点:分割是由 pattern 匹配到的决定的,匹配到的内容本身不会被包含在最终的分割结果列表中(除非使用了捕获组,我们后面会讲到)。


常见场景与示例

场景1:按单个中文字符分割

这是最简单的情况,假设你想用某个特定的中文字符(比如逗号 ",")来分割字符串。

import re
text = "苹果,香蕉,橙子,葡萄"
# 使用 re.split() 按中文逗号分割
result = re.split(",", text)
print(result)
# 输出: ['苹果', '香蕉', '橙子', '葡萄']

这与 text.split(",") 的效果完全一样。re.split 的优势在于可以使用更复杂的模式。

Python re.split如何正确分割中文?-图2
(图片来源网络,侵删)

场景2:按多个中文字符或符号分割

假设你的字符串中混合了中文逗号 "," 和英文逗号 ",",你想用它们作为分隔符。

import re
text = "苹果,香蕉, 橙子; 葡萄"
# 使用字符集 [...] 来匹配多个可能的分隔符
# [,,;] 表示匹配 "、" 或 "," 或 ";"
result = re.split("[,,;]", text)
print(result)
# 输出: ['苹果', '香蕉', ' 橙子', ' 葡萄']

注意," 橙子" 前面有一个空格,因为分割符是 ,它和 "橙子" 之间的空格没有被匹配到,所以保留了下来。

场景3:按中文字符和空白的组合分割

这是更常见的需求,比如按一个或多个空格、制表符或标点符号来分割。

import re
text = "苹果 香蕉,橙子;葡萄"
# \s+ 匹配一个或多个空白字符(包括空格, \t, \n 等)
# [,;] 匹配中文逗号或分号
# | 表示 "或" 的逻辑
# 整个模式 [,;|\s+] 表示匹配:中文逗号、分号 或 一个或多个空白字符
result = re.split("[,;|\s+]", text)
print(result)
# 输出: ['苹果', '香蕉', '橙子', '葡萄']

这个例子非常实用,它能处理各种常见的空白和标点。

Python re.split如何正确分割中文?-图3
(图片来源网络,侵删)

场景4:按中文字词分割(高级用法)

如果你想将字符串拆分成单个的汉字,而不是按特定标点符号拆分,可以使用 Unicode 属性。

  • \p{Han}:匹配任何一个汉字(在 Python 3.11+ 中可用,需要 regex 库)。
  • [\u4e00-\u9fff]:匹配 CJK 统一表意文字基本区,即大部分常用汉字(适用于标准 re 库)。

方法A:使用标准 re 库(推荐)

import re
text = "我爱北京天安门"
# \u4e00 到 \u9fff 是汉字的 Unicode 范围
# + 表示匹配一个或多个连续的汉字
# 我们想分割的是非汉字,所以用 [^\u4e00-\u9fff]+
# [^...] 表示匹配 "非..." 的字符
result = re.split("[^\u4e00-\u9fff]+", text)
print(result)
# 输出: ['我', '爱', '北京', '天安门']

注意:这个结果可能不是你想要的,因为它把连续的汉字 "北京" 和 "天安门" 作为一个整体,如果你要拆成单个汉字,可以这样:

import re
text = "我爱北京天安门"
# 使用 findall 来查找所有单个汉字
result = re.findall(r"[\u4e00-\u9fff]", text)
print(result)
# 输出: ['我', '爱', '北', '京', '天', '安', '门']

对于“按字拆分”这个需求,re.findall() 通常比 re.split() 更直接。

方法B:使用 regex 库(功能更强大)

regex 库是 re 的超集,支持更现代的正则表达式语法,\p{Han}

首先需要安装:pip install regex

import regex # 注意,导入的是 regex 而不是 re
text = "我爱北京天安门"
# \p{Han} 直接匹配任意汉字
# 同样,我们想分割的是非汉字,所以用 [^\p{Han}]+
result = regex.split("[^\p{Han}]+", text)
print(result)
# 输出: ['我', '爱', '北京', '天安门']

重要细节:捕获组对 re.split() 的影响

pattern 中包含捕获组(即括号 ),那么被匹配到的分割符也会被包含在结果列表中。

import re
text = "苹果,香蕉,橙子"
# 模式 "(,)" 中包含了捕获组 ()
result_with_group = re.split("(,)", text)
print(f"使用捕获组: {result_with_group}")
# 输出: 使用捕获组: ['苹果', ',', '香蕉', ',', '橙子']
# 模式 "," 中没有捕获组
result_without_group = re.split(",", text)
print(f"不使用捕获组: {result_without_group}")
# 输出: 不使用捕获组: ['苹果', '香蕉', '橙子']

这个特性在某些场景下非常有用,比如你想在分割后还保留分隔符本身。


总结与最佳实践

需求 推荐方法 示例
按特定中文标点/符号分割 re.split() + 精确匹配 re.split(",", text)
按多种符号或空白分割 re.split() + 字符集 [...] re.split("[,,;\s+]", text)
按非汉字内容分割成词语 re.split() + Unicode 范围 [^\u4e00-\u9fff]+ re.split("[^\u4e00-\u9fff]+", "我爱北京") -> ['我', '爱', '北京']
拆分成单个汉字 re.findall() + Unicode 范围 [\u4e00-\u9fff] re.findall(r"[\u4e00-\u9fff]", "我爱北京") -> ['我', '爱', '北', '京']
需要保留分割符 re.split() + 使用捕获组 re.split("(,)", "苹果,香蕉") -> ['苹果', ',', '香蕉']
处理复杂 Unicode 属性 使用 regex regex.split("[^\p{Han}]+", text)

对于绝大多数 Python 标准 re 库配合 Unicode 范围 [\u4e00-\u9fff] 已经足够处理绝大多数中文文本的分割需求regex 库是一个强大的补充,但并非必需。

分享:
扫描分享到社交APP
上一篇
下一篇