如何用正则表达式拆分包含特定字符的字符串

作者:袖梨 2026-07-11
正则表达式拆分字符串的核心是re.split()方法,以匹配的分隔符为切割点返回子串列表;支持字符集指定分隔符、保留分隔符、排除特定上下文(如引号内)、处理空字段及限制分割次数。

正则表达式拆分字符串的核心在于用 re.split() 方法,把匹配到的分隔符(而非字符串本身)当作切割点,从而得到子串列表。

指定字符作为分隔符

最常见需求是按某个或某几个固定字符切分。比如用逗号、分号或竖线分割:

  • 写法:re.split(r'[;,|]', text) —— 方括号内是字符集,匹配其中任意一个
  • 注意:特殊字符如 .*+ 在字符集里不需转义;但 ]-^ 放在特定位置时有特殊含义,建议放开头或结尾避免歧义
  • 示例:re.split(r'[;,s]+', "a,b; ctd") 得到 ['a', 'b', 'c', 'd'],其中 s 匹配空白,+ 表示连续多个也算一次分隔

保留分隔符本身

默认 re.split() 会丢弃分隔符。若想保留,可用带捕获组的模式:

  • 写法:re.split(r'([;,|])', text) —— 括号让分隔符也进入结果列表
  • 结果形如 ['a', ',', 'b', ';', 'c'],偶数索引是内容,奇数索引是分隔符
  • 如果只想提取内容+分隔符配对,更适合用 re.findall(r'([^;,|]+)([;,|]?)', text),但逻辑更重,按需选择

排除某些上下文中的分隔符

有时分隔符有例外,比如引号内的逗号不算分隔符。这时需用否定逻辑或环视断言:

  • 简单规避:先用 re.sub() 替换掉“受保护”的分隔符(如把 "a,b" 中的逗号临时替换成特殊标记),再 split,最后还原
  • 进阶写法:re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', text) —— 利用正向先行断言,只在引号外的逗号处切分(适用于简单双引号包裹场景)
  • 实际中,复杂嵌套结构(如含转义引号)建议不用纯正则,改用专门的 CSV 解析器更可靠

控制空字段和连续分隔符

连续分隔符或首尾分隔符会产生空字符串,常需清理:

  • re.split(r's+', text.strip()) 先去头尾空白,再按一个及以上空白切分,避免空项
  • 若允许空字段但想过滤掉,可在 split 后加 [x for x in result if x]
  • 使用 maxsplit= 参数限制最多切几次,例如 re.split(r's+', text, maxsplit=2) 只切前两个空格,返回最多 3 段

相关文章

精彩推荐