在双引号内忽略逗号,如何分割字符串?

57 投票
2 回答
39969 浏览
提问于 2025-04-17 05:58

我有一些输入内容,像下面这样:

A,B,C,"D12121",E,F,G,H,"I9,I8",J,K

这些用逗号分隔的值可以是任意顺序。我想要根据逗号来分割这个字符串;但是如果某些内容在双引号里面,我需要忽略里面的逗号,并且去掉双引号。所以,最终的输出应该是这样的字符串列表:

['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

2 个回答

0

如果你想用正则表达式来解决这个问题,一个简单的方法是用逗号(,)或者引号中的字符("(.*?)")来分割字符串;然后再过滤掉空值。

s = 'A,B,C,"D12121",E,F,G,H,"I9,I8",J,K'
splits = list(filter(None, re.split(r',|"(.*?)"', s)))
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

另一种方法是使用 re.findall(),用一个模式来捕获引号中的字符("(.*?)")或者不是逗号的字符(([^,]+))。这样会生成一个包含两个元素的元组列表,其中一个元素可能是空字符串;所以只需要把这些元组连接起来就可以了。

splits = list(map(''.join, re.findall(r'"(.*?)"|([^,]+)', s)))
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

不过,我认为标准的 csv 库是这里最好的解决方案。需要注意的是,csv.reader 需要一个字符串列表,所以如果你想分割一个单独的字符串,记得把它放在一个函数里。

import csv
splits = next(csv.reader([s]))
76

Lasse说得对;这是一个用逗号分隔的值文件,所以你应该使用csv模块。下面是一个简单的例子:

from csv import reader

# test
infile = ['A,B,C,"D12121",E,F,G,H,"I9,I8",J,K']
# real is probably like
# infile = open('filename', 'r')
# or use 'with open(...) as infile:' and indent the rest

for line in reader(infile):
    print line
# for the test input, prints
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

撰写回答