我有一些输入,看起来像这样:
A,B,C,"D12121",E,F,G,H,"I9,I8",J,K
逗号分隔的值可以是任意顺序。我想要在逗号上拆分字符串;但是,在某些内容被双引号包含的情况下,我需要忽略逗号并去掉引号。因此,基本上输出将是这个字符串列表:
['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']
我有一些输入,看起来像这样:
A,B,C,"D12121",E,F,G,H,"I9,I8",J,K
逗号分隔的值可以是任意顺序。我想要在逗号上拆分字符串;但是,在某些内容被双引号包含的情况下,我需要忽略逗号并去掉引号。因此,基本上输出将是这个字符串列表:
['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']
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']
reader
,或者应该如何使用它? - heltonbikercsv.reader
被用在for
行中--它从输入可迭代对象中读取一行,并将其转换为单元格列表。 - agfskipinitialspace=True
传递给 reader
来解决逗号后面的空格问题。 - Blckknght,
)或引号之间的字符("(.*?)"
)上进行拆分;然后过滤掉空值。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]))