在逗号处分割字符串,但忽略双引号内的逗号?

56

我有一些输入,看起来像这样:

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

逗号分隔的值可以是任意顺序。我想要在逗号上拆分字符串;但是,在某些内容被双引号包含的情况下,我需要忽略逗号并去掉引号。因此,基本上输出将是这个字符串列表:

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

13
你考虑过在Python中使用csv模块吗? - Lasse V. Karlsen
2个回答

75

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']

1
我不确定这是否回答了问题。输出是否符合 OP 的要求?这里在哪里使用了 reader,或者应该如何使用它? - heltonbiker
1
@heltonbiker 是的,它会给出所需的输出。请查看我的回答的最后一行,或者运行代码并测试它。csv.reader被用在for行中--它从输入可迭代对象中读取一行,并将其转换为单元格列表。 - agf
7
我也有过这种感觉,使用Python有时候感觉好像什么都没做,但它依然能正常运行 :) - agf
1
如果您在这里寻找此答案的正则表达式,请参见此答案 - Austin A
1
你可以通过将 skipinitialspace=True 传递给 reader 来解决逗号后面的空格问题。 - Blckknght
显示剩余9条评论

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(),其中捕获引号之间的字符("(.*?) ")或非逗号字符(([^,]+))。它创建一个2元组列表,其中一个值是空字符串;因此,只需连接这些元组即可完成操作。
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]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接