使用嵌套的分隔符号拆分Python字符串

con*_*tor 7 python regex string

我需要从字符串

i = "1,'Test','items (one, two, etc.)',1,'long, list'"
Run Code Online (Sandbox Code Playgroud)

提取下一个字符串的数组:

['1', "'Test'", "'items (one, two, etc.)'", '1', "'long, list'"]
Run Code Online (Sandbox Code Playgroud)

在regexpress的帮助下

r=re.split(r',+(?=[^()]*(?:\(|$))', i)
Run Code Online (Sandbox Code Playgroud)

我只收到下一个结果:

['1', "'Test'", "'items (one, two, etc.)'", '1', "'long", " list'"]
Run Code Online (Sandbox Code Playgroud)

UPD1

应支持NULL

i = "1,'Test',NULL,'items (one, two, etc.)',1,'long, list'"
['1', "'Test'", 'NULL', "'items (one, two, etc.)'", '1', "'long, list'"]
Run Code Online (Sandbox Code Playgroud)

Kas*_*mvd 4

在这种情况下不需要。您可以在列表理解中re.split使用:re.findall

>>> [k for j in re.findall(r"(\d)|'([^']*)'",i) for k in j if k]
['1', 'Test', 'items (one, two, etc.)', '1', 'long, list']
Run Code Online (Sandbox Code Playgroud)

前面的正则表达式将匹配一个引号'([^']*)'或任何数字 ( \d) 之间的任何内容。

或者在这种情况下,作为更有效的方法,您可以使用ast.literal_eval

>>> from ast import literal_eval
>>> literal_eval(i)
(1, 'Test', 'items (one, two, etc.)', 1, 'long, list')
Run Code Online (Sandbox Code Playgroud)