1

文字列をコンマ「、」で分割しようとしています

例えば:

"hi, welcome"  I would like to produce ["hi","welcome"]

でも:

"'hi,hi',hi" I would like to produce ["'hi,hi'","hi"]

"'hi, hello,yes','hello, yes','eat,hello'" I would like to produce ["'hi, hello,yes'","'hello, yes'","'eat,hello'"]

"'hiello, 332',9" I would like to produce ["'hiello, 332'","9"]

関数を使用できるとは思い.split()ません。おそらく正規表現を使用して、これを行う方法を知っている人はいますか?

4

4 に答える 4

16

引数を指定してcsvモジュールを使用するquotecharか、入力を変換"して、引用文字にさらに標準的な文字を使用することができます。

>>> import csv
>>> from cStringIO import StringIO
>>> first=StringIO('hi, welcome')
>>> second=StringIO("'hi,hi',hi")
>>> third=StringIO("'hi, hello,yes','hello, yes','eat,hello'")
>>> fourth=StringIO("'hiello, 332',9")
>>> rfirst=csv.reader(first,quotechar="'")
>>> rfirst.next()
['hi', ' welcome']
>>> rsecond=csv.reader(second,quotechar="'")
>>> rsecond.next()
['hi,hi', 'hi']
>>> rthird=csv.reader(third,quotechar="'")
>>> rthird.next()
['hi, hello,yes', 'hello, yes', 'eat,hello']
>>> rfourth=csv.reader(fourth,quotechar="'")
>>> rfourth.next()
['hiello, 332', '9']

>>> second=StringIO('"hi,hi",hi') # This will be more straightforward to interpret.
>>> r=csv.reader(second)
>>> r.next()
['hi,hi', 'hi']
>>> third=StringIO('"hi, hello,yes","hello, yes","eat,hello"')
>>> r=csv.reader(third)
>>> r.next()
['hi, hello,yes', 'hello, yes', 'eat,hello']
于 2012-05-19T15:08:26.307 に答える
2

あなたが求めたように、正規表現で:

import re

>>>pattern = re.compile(r"([^',]+,?|'[^']+,?')")
>>>re.findall(pattern, "hi, welcome")
['hi', 'welcome']

>>>re.findall(pattern, "'hi, hello,yes','hello, yes','eat,hello'")
["'hi, hello,yes'", "'hello, yes'", "'eat,hello'"]

>>>re.findall(pattern, "'hi,hi',hi")
 ["'hi,hi'", 'hi']

>>>re.findall(pattern, "'hiello, 332',9")
["'hiello, 332'", '9']

パターンの最初の部分 は、[^',]+,?引用符もコンマも含まないセグメントをキャッチします。末尾にカンマがある場合とない場合があります (最後のセグメントの場合)。

2 番目の部分 は'[^']+,?'、引用符で囲まれたセグメントをキャッチします。内部にこれ以上引用符を付けるべきではありませんが、カンマを含めることができます。

于 2012-05-19T16:24:10.617 に答える
1

as delimiter およびas quotecharを使用してcsv リーダーを使用できます。それはあなたが期待するものと互換性があるようです。,'

于 2012-05-19T15:11:40.377 に答える
1

なしで直接これを行うcsvre、それほど問題はありません:

def splitstring(s):
    result = []
    for i, piece in enumerate(s.split("'")):
        if piece:
            if i % 2:  # odd pieces are between quotes
                result.append("'" + piece + "'")
            else:  # even pieces aren't
                for subpiece in piece.split(","):
                    if subpiece:
                        result.append(subpiece)
    return result
于 2012-05-20T00:10:50.240 に答える