You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python RegEx拆分CSV文件中的数字与文本至多列?

解决方案:用Python正则拆分CSV中的数字与文本

核心思路

针对每行数据的结构(前导0-3个数字,后跟文本),用正则表达式捕获最多3个数字分组和文本分组,再将空的数字分组替换为指定填充符--------,最后重组为目标格式的行数据。

正则表达式设计

使用以下正则模式匹配每行内容:

^(\d+)?(?:\s+(\d+))?(?:\s+(\d+))?\s*(.*)$
  • ^(\d+)?:匹配行首第一个数字(可选,无则分组为None)
  • (?:\s+(\d+))?:非捕获组匹配空格+第二个数字(可选)
  • (?:\s+(\d+))?:非捕获组匹配空格+第三个数字(可选)
  • \s*(.*)$:匹配数字后所有剩余文本(\s*用于去除数字与文本间的多余空格)

Python代码实现

import re
import csv

# 正则模式
pattern = re.compile(r'^(\d+)?(?:\s+(\d+))?(?:\s+(\d+))?\s*(.*)$')
fill_char = '--------'

# 读取原CSV并处理
with open('input.csv', 'r', encoding='utf-8') as infile, open('output.csv', 'w', newline='', encoding='utf-8') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    
    # 写入目标表头
    writer.writerow(['number1', 'number2', 'number3', 'Text'])
    
    # 跳过原CSV的表头(示例中原表头为"表头")
    next(reader)
    
    for row in reader:
        content = row[0].strip()
        match = pattern.match(content)
        
        if match:
            num1, num2, num3, text = match.groups()
            # 替换空数字分组为填充符
            num1 = num1 if num1 is not None else fill_char
            num2 = num2 if num2 is not None else fill_char
            num3 = num3 if num3 is not None else fill_char
            # 文本为空时保持空值,可按需调整
            text = text if text else ''
            writer.writerow([num1, num2, num3, text])

代码说明

  1. 正则匹配:覆盖所有场景——无数字、1个数字、2个数字、3个数字的行,确保不会遗漏数据。
  2. 填充处理:统一将未捕获到数字的列替换为--------,保证输出CSV的列结构一致。
  3. CSV读写:用Python内置csv模块处理文件,避免手动解析CSV时遇到的格式问题(比如文本含逗号的情况)。

测试验证

用你提供的示例数据测试,处理结果完全符合目标格式:

  • 输入1 这是第一行。 → 输出['1', '--------', '--------', '这是第一行。']
  • 输入这是第二行。 → 输出['--------', '--------', '--------', '这是第二行。']
  • 输入3 4 这是第三行。 → 输出['3', '4', '--------', '这是第三行。']
  • 输入5 6 7 这是特殊行。 → 输出['5', '6', '7', '这是特殊行。']

内容的提问来源于stack exchange,提问作者jonson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:53:16