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
相关产品推荐
相关产品推荐

