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

djm*_*mac 13 python csv

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

例如:

teststring = '48, "one, two", "2011/11/03"'
teststring.split(",")
['48', ' "one', ' two"', ' "2011/11/03"']
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

['48', ' "one, two"', ' "2011/11/03"']
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Ray*_*ger 24

CSV模块,如果你设置选项来处理这种方言将工作:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

  • +1:很好的捕获,对于这个'skipinitialspace`!我试图理解`csv`文档,但无法使OP输入正常工作:) (3认同)

jco*_*ado 7

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

默认情况下,shlex.split将在未用引号引起来的空白字符处分割字符串:

>>> shlex.split(teststring)
['48,', 'one, two,', '2011/11/03']
Run Code Online (Sandbox Code Playgroud)

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

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

注意:解析器对象用作迭代器来一一获取标记。因此,list(parser)迭代解析器对象并返回在您需要的地方分割的字符串。


Dav*_*ebb 6

您可以使用标准库中csv模块:

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

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

您必须小心数据格式或告诉csv如何处理它.默认情况下,引号必须在逗号之后立即出现,否则csv模块会将字段解释为以空格开头而不是引用.您可以使用skipinitialspace选项解决此问题.


Mik*_*rov 6

这不是标准模块,您必须通过 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']
Run Code Online (Sandbox Code Playgroud)


Aco*_*orn 3

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

  • 该链接不足以解决问题。开箱即用的 csv 阅读器将无法正确解析 OP 的测试字符串。 (2认同)