分割字符串,忽略引号中的分隔符(python)



我想在逗号上分割字符串,但忽略引号内的大小写:

例如:

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

,我想要的输出是:

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

这可能吗?

如果你设置选项来处理这种方言,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']

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

>>> 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()时返回一个字符串。这意味着你不能直接将字符串string传递给reader(),但你可以像上面那样将它包含在一个列表中。

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

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

默认情况下,shlex.split将在没有括在引号中的空白字符处分割字符串:

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

这并没有从字符串中删除末尾的逗号,但它接近于您所需要的。但是,如果您定制解析器,将逗号视为空白字符,那么您将得到所需的输出:

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

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

这不是一个标准模块,你必须通过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']

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

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

最新更新