如何用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个数字、2个数字、3个数字的行,确保不会遗漏数据。
- 填充处理:统一将未捕获到数字的列替换为
--------,保证输出CSV的列结构一致。 - CSV读写:用Python内置
csv模块处理文件,避免手动解析CSV时遇到的格式问题(比如文本含逗号的情况)。
测试验证
用你提供的示例数据测试,处理结果完全符合目标格式:
- 输入
1 这是第一行。→ 输出['1', '--------', '--------', '这是第一行。'] - 输入
这是第二行。→ 输出['--------', '--------', '--------', '这是第二行。'] - 输入
3 4 这是第三行。→ 输出['3', '4', '--------', '这是第三行。'] - 输入
5 6 7 这是特殊行。→ 输出['5', '6', '7', '这是特殊行。']
内容的提问来源于stack exchange,提问作者jonson
相关产品推荐
相关产品推荐

