关于python:将逗号分隔的字符串转换为列表,但忽略引号中的逗号

Transform comma separated string into a list but ignore comma in quotes

如何将"1,,2'3,4'"转换为列表?逗号分隔各个项目,除非它们在引号内。在这种情况下,逗号将包含在项目中。

这是期望的结果:['1', '', '2', '3,4']。我在另一个线程上找到的忽略引号的regex如下:

1
re.compile(r'''((?:[^,"']|"[^"]*"|'[^']*')+)''')

但这给了我这个输出:

1
['', '1', ',,',"2'3,4'", '']

我不明白这些多余的空字符串来自何处,以及为什么这两个逗号甚至被打印出来,更不用说一起了。

我试着自己做这个regex:

1
re.compile(r'''(, |"[^"]*" | '[^']*')''')

结果没有发现任何东西,只是返回了我的原始列表。

我不明白为什么,它至少应该检测到逗号吗?如果在逗号后加一个?,就会出现同样的问题。


与其使用正则表达式,不如使用csv模块,因为您要处理的是csv字符串:

1
2
3
4
5
6
7
from cStringIO import StringIO
from csv import reader

file_like_object = StringIO("1,,2,'3,4'")
csv_reader = reader(file_like_object, quotechar="'")
for row in csv_reader:
    print row

这将产生以下输出:

1
['1', '', '2', '3,4']


pyparsing包含一个用于逗号分隔列表的预定义表达式:

1
2
3
4
>>> from pyparsing import commaSeparatedList
>>> s ="1,,2'3,4'"
>>> print commaSeparatedList.parseString(s).asList()
['1', '',"2'3","4'"]

嗯,看起来你的数据有错别字,2后面缺少逗号:

1
2
3
>>> s ="1,,2,'3,4'"
>>> print commaSeparatedList.parseString(s).asList()
['1', '', '2',"'3,4'"]