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

Python正则表达式处理CSV:正确提取含逗号的化合物名称

解决化学分析CSV中含逗号化合物名的拆分问题

问题核心

你的CSV数据里,化合物名没有用引号包裹,但本身包含逗号(比如苯, 甲苯混合物),普通逗号拆分或原有的引号匹配正则会把化合物名拆成多个字段。好在每行末尾是固定的Area和tR (min)数值字段,我们可以利用这个固定结构反向提取完整的化合物名。

实现思路

核心逻辑是从行尾的固定字段反向匹配:

  • 每行最后两个字段都是数值类型(Area和tR值),格式是, 数值, 数值(逗号前后可能带空格)
  • 用正则先匹配出行尾的这两个数值字段,剩下的前面部分就是完整的化合物名(不管里面有多少逗号)
  • 拆分后将化合物名与后面两个数值字段组合成正确的字段列表

正则表达式方案

用这个正则就能精准匹配:

^(.*?)\s*,\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)$

正则解释

  • ^(.*?):非贪婪匹配从行首到最后两个逗号前的所有内容,直接拿到完整的化合物名(包含内部的逗号)
  • \s*,\s*:匹配分隔逗号,兼容逗号前后的任意空格(包括无空格、多个空格)
  • (\d+\.?\d*):匹配整数或小数格式的数值,对应Area字段
  • (\d+\.?\d*):匹配第二个数值,对应tR (min)字段
  • $:锚定行尾,确保匹配的是整行内容

Python代码实现

假设你的CSV示例数据如下:

苯, 甲苯混合物, 1234.56, 2.34
乙醇, 乙酸乙酯混合液, 789.01, 1.56
纯丙酮, 456.78, 0.98

对应的Python处理代码:

import re

# 预编译正则,提升匹配效率
csv_pattern = re.compile(r'^(.*?)\s*,\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)$')

# 读取CSV行(实际场景可以用open读取文件逐行处理)
sample_lines = [
    "苯, 甲苯混合物, 1234.56, 2.34",
    "乙醇, 乙酸乙酯混合液, 789.01, 1.56",
    "纯丙酮, 456.78, 0.98"
]

for line in sample_lines:
    match_result = csv_pattern.match(line)
    if match_result:
        # 提取并清理字段
        compound = match_result.group(1).strip()
        area = match_result.group(2)
        tr_value = match_result.group(3)
        print(f"化合物: {compound} | Area: {area} | tR(min): {tr_value}")
    else:
        print(f"格式异常行: {line}")

运行结果

化合物: 苯, 甲苯混合物 | Area: 1234.56 | tR(min): 2.34
化合物: 乙醇, 乙酸乙酯混合液 | Area: 789.01 | tR(min): 1.56
化合物: 纯丙酮 | Area: 456.78 | tR(min): 0.98

边界情况适配

  • 如果数值是科学计数法(比如1.23e4):把正则里的(\d+\.?\d*)替换成(\d+\.?\d*|\d*\.?\d+[eE][+-]?\d+)即可支持
  • 如果化合物名前后有多余空格:用.strip()清理即可
  • 如果行格式不规范:代码里的if match_result会跳过异常行,避免程序崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:02:41