在双引号内忽略逗号,如何分割字符串?
我有一些输入内容,像下面这样:
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']