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

2024-10-01 02:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一根绳子

i = "1,'Test','items (one, two, etc.)',1,'long, list'"

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

['1', "'Test'", "'items (one, two, etc.)'", '1', "'long, list'"]

借助regexpress

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

我只收到下一个结果:

['1', "'Test'", "'items (one, two, etc.)'", '1', "'long", " list'"]

升级1

应支持NULL

i = "1,'Test',NULL,'items (one, two, etc.)',1,'long, list'"
['1', "'Test'", 'NULL', "'items (one, two, etc.)'", '1', "'long, list'"]

Tags: 字符串testreetcitems数组onenull
3条回答

可以使用单引号拆分:

i = "1,'Test','items (one, two, etc.)',1,'long, list'"



print([ele.strip(" ,") for ele in i.split("'") if ele.strip(",")])
['1', 'Test', 'items (one, two, etc.)', '1', 'long, list']

或与地图一起使用:

print([ele for ele in map(lambda x:  x.strip(", "), i.split("'")) if ele])

在python 3中使用map非常有效:

In [7]: i = "1,'Test','items (one, two, etc.)',1,'long, list'"

In [8]: timeit [ele for ele in map(lambda x:  x.strip(", "), i.split("'")) if ele]
1000000 loops, best of 3: 1.5 µs per loop

In [9]: r = re.compile(r"(\d)|'([^']*)'") 

In [10]: timeit [k for j in r.findall(i) for k in j if k]
100000 loops, best of 3: 3.92 µs per loop

更好地使用python2和itertools.imap

In [9]: from itertools  import imap   
In [10]: timeit [ele for ele in imap(lambda x:  x.strip(", "), i.split("'")) if ele]
1000000 loops, best of 3: 871 ns per loop  

In [11]: r = re.compile(r"(\d)|'([^']*)'")
In [12]: timeit [k for j in r.findall(i) for k in j if k]
100000 loops, best of 3: 4.27 µs per loop

In [17]: from ast import literal_eval
In [18]: timeit literal_eval(i)
100000 loops, best of 3: 16.2 µs per loop

所有这些函数都返回相同的输出条文本求值,因为它将数字求值为整数:

In [19]: literal_eval(i)
Out[19]: (1, 'Test', 'items (one, two, etc.)', 1, 'long, list')

In [20]: [k for j in r.findall(i) for k in j if k]
Out[20]: ['1', 'Test', 'items (one, two, etc.)', '1', 'long, list']

In [21]: [ele for ele in imap(lambda x:  x.strip(", "), i.split("'")) if ele]Out[21]: ['1', 'Test', 'items (one, two, etc.)', '1', 'long, list']

空行没有什么不同:

i = "1,'Test',NULL,'items (one, two, etc.)',1,'long, list'"



print([ele for ele in map(lambda x:  x.strip(", "), i.split("'")) if ele])

['1', 'Test', 'NULL', 'items (one, two, etc.)', '1', 'long, list']

这是csv模块的任务:

import csv
from StringIO import StringIO
line = "1,'Test','items (one, two, etc.)',1,'long, list'"
reader = csv.reader(StringIO(line), quotechar="'")
row = next(reader)

# row == ['1', 'Test', 'items (one, two, etc.)', '1', 'long, list']

这里的关键是创建一个CSV读取器,将单引号指定为引号字符。你知道吗

在这种情况下你不需要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']

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

或者,作为一种更有效的方法,您可以使用ast.literal_eval

>>> from ast import literal_eval
>>> literal_eval(i)
(1, 'Test', 'items (one, two, etc.)', 1, 'long, list')

相关问题 更多 >