2013-10-01 67 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...