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

