我想在逗号上拆分一个字符串,但忽略它在引号内的情况:
例如:
teststring = '48, "one, two", "2011/11/03"'
teststring.split(",")
['48', ' "one', ' two"', ' "2011/11/03"']
我想要的输出是:
['48', ' "one, two"', ' "2011/11/03"']
这可能吗?
答案 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']