我想在逗号上拆分一个字符串,但忽略它在引号内的情况:
例如:
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)
您可以使用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)迭代解析器对象并返回在您需要的地方分割的字符串。
您可以使用标准库中的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选项解决此问题.
这不是标准模块,您必须通过 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)
您应该使用Python csv库:http://docs.python.org/library/csv.html