0

私は、最も効率的な方法、そして最も「Pythonのような」方法で、スティングをPythonで分割したいと考えています。次の文字列があるとします。

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

次のリストを達成するにはどうすればよいですか。

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

つまり、中かっこの間の名前を削除したいと思います。

4

4 に答える 4

5

使用ast.literal_eval():

式ノード、または Python 式を含む Unicode または Latin-1 でエンコードされた文字列を安全に評価します。提供される文字列またはノードは、次の Python リテラル構造のみで構成されている可能性があります: 文字列、数値、タプル、リスト、辞書、ブール値、およびなし。

>>> from ast import literal_eval
>>> s = '"Jens", "kasper", "Michael"' 
>>> literal_eval(s)
('Jens', 'kasper', 'Michael')
>>> list(literal_eval(s))
['Jens', 'kasper', 'Michael']
于 2013-10-01T22:16:41.747 に答える
3

次のように分割できます。

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

次のように引用符を削除できます。

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

しかし実際には、最初の原則からパーサーを構築しようとするのではなく、この奇妙な文字列がどのように構築されたかを検討し、照合操作を行う必要があります。これらは Python リテラルですか? JSON文字列? 他の何か?', '.joinそれらは CSV モジュールまたは何か他のものと一緒に結合されましたか?

于 2013-10-01T22:18:59.830 に答える
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...
于 2013-10-01T22:39:26.350 に答える