2013-10-01 40 views
1

我想在python中分裂一个最有效的方式,并且是最“类似python”的方式。 说我有这个字符串:在python中分割字符串

s = '"Jens", "kasper", "Michael"' 

如何实现以下列表:

names = ["David", "Kasper", "Michael"] 

含义我想剥离大括号中的名字。

+3

我假设你的列表是为了Jens而不是David,对吧? – Ben

+0

“剥去花括号之间的名字” - 你的意思是“提取引号之间的名字”? – Blorgbeard

+0

你是如何得到这个字符串的? – abarnert

回答

5

使用ast.literal_eval()

安全评估的表达式节点或Unicode或Latin-1的编码含有一个Python表达式 字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串, 数字,元组,列表,字典,布尔值和无。

>>> from ast import literal_eval 
>>> s = '"Jens", "kasper", "Michael"' 
>>> literal_eval(s) 
('Jens', 'kasper', 'Michael') 
>>> list(literal_eval(s)) 
['Jens', 'kasper', 'Michael'] 
+2

如果字符串旨在成为字符串表示形式的Python元组,则这是正确的答案。但是,如果'literal_eval'恰好适用于某种不打算成为Python文字格式的格式,那么通常不是使用它的好理由。 – abarnert

+0

@abarnert是的,它看起来很适合OP提供的例子。但是,我同意这种格式是不寻常的(看起来像一个带引号的CSV),我们应该知道OP从哪里得到它。谢谢! – alecxe

3

您可以像这样把它分解:

>>> s = '"Jens", "kasper", "Michael"' 
>>> s.split(', ') 
['"Jens"', '"kasper"', '"Michael"'] 

可以剥去引号是这样的:

>>> [name.strip('"') for name in s.split(', ')] 
['Jens', 'kasper', 'Michael'] 

不过说真的,你应该考虑这个奇怪的字符串是如何构造,并进行匹配操作,而不是试图从第一原则构建解析器。这些Python文字是? JSON字符串?还有别的吗?他们是否与', '.join或CSV模块或其他东西结合在一起?

+0

当然,这不会奇迹般地大写'kasper'或将'Jens'转换成'David' ......如果你真的想要这样做,你需要更全面的规范你的想法。 – abarnert

1

让我们的情况下添加到您的字符串:

>>> s = '"Jens", "kasper", "Michael", "Jean Paul", "Bond, James"' 
                 ^^  comma 

您可以使用CSV:

>>> import csv 
>>> list(csv.reader([s], skipinitialspace=True))[0] 
['Jens', 'kasper', 'Michael', 'Jean Paul', 'Bond, James'] 

还是一个正则表达式:

>>> import re 
>>> [e.group(1) for e in re.finditer(r'"([^"]+)"',s)] 
['Jens', 'kasper', 'Michael', 'Jean Paul', 'Bond, James'] 

该解决方案基于逗号分割将不会与嵌入式逗号一起使用:

>>> s = '"Jens", "kasper", "Michael"' 
>>> [e.strip().strip('"') for e in s.split(',')] 
['Jens', 'kasper', 'Michael', 'Jean Paul', 'Bond', 'James'] 
               ^^^^ wrong answer...