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

Python解析文本:如何忽略引号内的逗号作为分隔符?

问题:Python解析非标准CSV文本,忽略引号内的逗号分隔

需要解析文本文件,按逗号拆分内容,但不将引号内的逗号视为分隔符。文本格式不符合标准CSV(引号字符串前带有未引号内容),具体示例如下:

示例输入

cmd,print "AA"
cmd, print "AA,BB,CC"
cmd,   print " AA, BB, CC ", separate-window

期望结果(Python语法)

[['cmd', 'print "AA"'], 
 ['cmd', 'print "AA,BB,CC"'], 
 ['cmd', 'print " AA, BB, CC "', 'separate-window']]

已尝试方案的问题

  • 使用csv.reader:错误拆分引号内的逗号,得到['cmd', 'print "AA', 'BB', 'CC"']
  • 修改shlex配置:设置whitespace=','和whitespace_split=True后,虽能拆分但会移除引号,得到['cmd', 'print AA, BB, CC'],不符合保留引号的需求
  • 尝试re.split:对正向预查用法不熟悉,现有公开方案无法适配当前场景

解决方案:正则表达式精准拆分

通过正则表达式匹配不在引号对内部的逗号作为分隔符,核心逻辑是确保拆分用的逗号处于非引号包裹状态。

实现代码

import re

def split_non_standard_csv(line):
    # 匹配不在引号内的逗号
    split_pattern = re.compile(r',(?=(?:[^"]*"[^"]*")*[^"]*$)')
    parts = split_pattern.split(line)
    # 按需启用:去除每个元素首尾空格
    # parts = [segment.strip() for segment in parts]
    return parts

# 测试示例文本
test_lines = [
    'cmd,print "AA"',
    'cmd, print "AA,BB,CC"',
    'cmd,   print " AA, BB, CC ", separate-window'
]

# 生成结果
parsed_result = [split_non_standard_csv(line) for line in test_lines]
print(parsed_result)

运行结果

[['cmd', 'print "AA"'], ['cmd', ' print "AA,BB,CC"'], ['cmd', '   print " AA, BB, CC "', ' separate-window']]

若需要去除元素首尾空格,只需取消代码中parts = [segment.strip() for segment in parts]的注释,处理后结果与期望完全一致。

正则表达式说明

r',(?=(?:[^"]*"[^"]*")*[^"]*$)':

  • ,:定位要作为分隔符的逗号
  • (?=...):正向预查,验证逗号后方内容满足:
    • (?:[^"]*"[^"]*")*:匹配0或多组完整的引号对(非引号字符+引号+非引号字符+引号)
    • [^"]*$:确保剩余内容中没有未闭合的引号

通过此规则,可精准筛选出仅处于引号外的逗号作为拆分依据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:15:16