私は、最も効率的な方法、そして最も「Pythonのような」方法で、スティングをPythonで分割したいと考えています。次の文字列があるとします。
s = '"Jens", "kasper", "Michael"'
次のリストを達成するにはどうすればよいですか。
names = ["David", "Kasper", "Michael"]
つまり、中かっこの間の名前を削除したいと思います。
私は、最も効率的な方法、そして最も「Pythonのような」方法で、スティングをPythonで分割したいと考えています。次の文字列があるとします。
s = '"Jens", "kasper", "Michael"'
次のリストを達成するにはどうすればよいですか。
names = ["David", "Kasper", "Michael"]
つまり、中かっこの間の名前を削除したいと思います。
式ノード、または 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']
次のように分割できます。
>>> s = '"Jens", "kasper", "Michael"'
>>> s.split(', ')
['"Jens"', '"kasper"', '"Michael"']
次のように引用符を削除できます。
>>> [name.strip('"') for name in s.split(', ')]
['Jens', 'kasper', 'Michael']
しかし実際には、最初の原則からパーサーを構築しようとするのではなく、この奇妙な文字列がどのように構築されたかを検討し、照合操作を行う必要があります。これらは Python リテラルですか? JSON文字列? 他の何か?', '.join
それらは CSV モジュールまたは何か他のものと一緒に結合されましたか?
文字列にケースを追加しましょう:
>>> 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...