次のような文字列を取得できる必要があります。
'''foo, bar, "one, two", three four'''
に:
['foo', 'bar', 'one, two', 'three four']
私は(#pythonからのヒントで)解決策がshlexモジュールを含むだろうと感じています。
Shlexモジュールソリューションでは、引用符をエスケープし、ある引用符を別の引用符でエスケープし、Shellがサポートするすべての凝ったものを使用できます。
>>> import shlex
>>> my_splitter = shlex.shlex('''foo, bar, "one, two", three four''', posix=True)
>>> my_splitter.whitespace += ','
>>> my_splitter.whitespace_split = True
>>> print list(my_splitter)
['foo', 'bar', 'one, two', 'three', 'four']
エスケープされた引用符の例:
>>> my_splitter = shlex.shlex('''"test, a",'foo,bar",baz',bar \xc3\xa4 baz''',
posix=True)
>>> my_splitter.whitespace = ',' ; my_splitter.whitespace_split = True
>>> print list(my_splitter)
['test, a', 'foo,bar",baz', 'bar \xc3\xa4 baz']
取得したい複雑さによって異なります...複数のタイプの引用を許可しますか?エスケープされた引用符はどうですか?
構文は、Python標準ライブラリ:でサポートされている一般的なCSVファイル形式に非常によく似ています。
import csv
reader = csv.reader(['''foo, bar, "one, two", three four'''], skipinitialspace=True)
for r in reader:
print r
出力:
['foo', 'bar', 'one, two', 'three four']
HTH!
csv モジュールを検討することもできます。試したことはありませんが、入力データはシェル構文(shlexが解析するもの)よりもCSVに近いようです。
あなたはこのようなことをすることができます:
>>> import re
>>> pattern = re.compile(r'\s*("[^"]*"|.*?)\s*,')
>>> def split(line):
... return [x[1:-1] if x[:1] == x[-1:] == '"' else x
... for x in pattern.findall(line.rstrip(',') + ',')]
...
>>> split("foo, bar, baz")
['foo', 'bar', 'baz']
>>> split('foo, bar, baz, "blub blah"')
['foo', 'bar', 'baz', 'blub blah']
私はPythonのRegexエンジンにあまり詳しくありませんが、ここで探しているのは正規表現だと思います。
レイジーマッチを使用すると仮定すると、配列に入れることができる文字列のマッチのセットを取得できます。