拆分字符串,忽略引号内的分隔符(python)

时间:2011-11-21 07:07:58

标签: python csv

我想在逗号上拆分一个字符串,但忽略它在引号内的情况:

例如:

teststring = '48, "one, two", "2011/11/03"'
teststring.split(",")
['48', ' "one', ' two"', ' "2011/11/03"']

我想要的输出是:

['48', ' "one, two"', ' "2011/11/03"']

这可能吗?

6 个答案:

答案 0 :(得分:24)

如果设置处理此方言的选项,csv module将起作用:

>>> import csv
>>> teststring = '48, "one, two", "2011/11/03"'
>>> for line in csv.reader([teststring], skipinitialspace=True):
    print line


['48', 'one, two', '2011/11/03']

答案 1 :(得分:6)

您可以使用标准库中的the csv module

>>> import csv
>>> testdata = ['48, "one, two", "2011/11/03"']
>>> testcsv = csv.reader(testdata,skipinitialspace=True)
>>> testcsv.next()
['48', 'one, two', '2011/11/03']

要注意的一件事是csv.reader个对象期望iterator每次调用next()时都会返回一个字符串。这意味着您无法将字符串字符串直接传递给reader(),但您可以将其包含在上面的列表中。

您必须小心数据格式或告诉csv如何处理它。默认情况下引号必须在逗号后立即csv模块将字段解释为以空格开头而不是引用。您可以使用the skipinitialspace option修复此问题。

答案 2 :(得分:3)

您可以使用shlex模块来解析字符串。

默认情况下,shlex.split会将字符串拆分为未用引号括起的空白字符:

>>> shlex.split(teststring)
['48,', 'one, two,', '2011/11/03']

这不会删除字符串中的尾随逗号,但它接近您需要的内容。但是,如果您自定义解析器以将逗号视为空白字符,那么您将获得所需的输出:

>>> parser = shlex.shlex(teststring)
>>> parser.whitespace
' \t\r\n'
>>> parser.whitespace += ','
>>> list(parser)
['48', '"one, two"', '"2011/11/03"']

注意:解析器对象用作迭代器,逐个获取标记。因此,list(parser)遍历解析器对象并返回所需的字符串。

答案 3 :(得分:1)

您应该使用Python csv库:http://docs.python.org/library/csv.html

答案 4 :(得分:1)

这不是标准模块,您必须通过pip安装它,但也可以尝试tssplit:

In [5]: from tssplit import tssplit 
In [6]: tssplit('48, "one, two", "2011/11/03"', quote='"', delimiter=',', trim=' ')
Out[6]: ['48', 'one, two', '2011/11/03']

答案 5 :(得分:-1)

import shlex
teststring = '48, "one, two", "2011/11/03"'
output = shlex.split(teststring)
output = [re.sub(r",$","",w) for w in output]
print output
['48', 'one, two', '2011/11/03']