24

次のような文字列を取得できる必要があります。

'''foo, bar, "one, two", three four'''

の中へ:

['foo', 'bar', 'one, two', 'three four']

ソリューションには shlex モジュールが含まれる気がします (#python からのヒントを使用)。

4

6 に答える 6

41

どれだけ複雑にしたいかによって異なります...複数のタイプの引用を許可しますか。エスケープされた引用符はどうですか?

構文は、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']

チッ!

于 2008-09-22T23:09:45.487 に答える
27

shlex モジュール ソリューションでは、エスケープされた引用符、ある引用符が別の引用符をエスケープすること、およびシェルがサポートするすべての凝ったものを使用できます。

>>> 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']
于 2008-09-22T23:15:45.050 に答える
5

csvモジュールを検討することもできます。試したことはありませんが、入力データはシェル構文よりも CSV に近いようです (これは shlex が解析するものです)。

于 2008-09-22T22:56:56.190 に答える
1

次のようなことができます。

>>> 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']
于 2008-09-22T23:02:31.153 に答える
0

ここで探しているのは正規表現だと思いますが、Python の正規表現エンジンにはあまり詳しくありません。

遅延一致を使用すると仮定すると、配列に入れることができる文字列で一連の一致を取得できます。

于 2008-10-01T14:08:53.300 に答える
-2

きれいにする必要がない場合は、次の方法で問題が解決する可能性があります。

def f(s, splitifeven):
    if splitifeven & 1:
        return [s]
    return [x.strip() for x in s.split(",") if x.strip() != '']

ss = 'foo, bar, "one, two", three four'

print sum([f(s, sie) for sie, s in enumerate(ss.split('"'))], [])
于 2008-09-22T23:09:25.940 に答える