2

指定されたセパレーターで文字列を分割する関数を作成しようとしています。正規表現を使用してすべての特殊文字を無視する同様の質問への回答を見てきましたが、セパレータの変数を渡すことができるようにしたいと考えています。

これまでのところ、私は持っています:

def split_string(source, separators): 
    source_list = source
    for separator in separators:
        if separator in source_list:
                source_list.replace(separator, ' ') 
    return source_list.split()

しかし、それはセパレーターを削除していません

4

4 に答える 4

5

(私にとって)正規表現の解決策はかなり簡単に思えます:

import re
def split_string(source,separators):
    return re.split('[{0}]'.format(re.escape(separators)),source)

例:

>>> import re
>>> def split_string(source,separators):
...     return re.split('[{0}]'.format(re.escape(separators)),source)
... 
>>> split_string("the;foo: went to the store",':;')
['the', 'foo', ' went to the store']

ここで正規表現を使用する理由は、セパレーターを使用したくない' '場合に備えて、これでも機能します...


複数文字のセパレーターを使用できる代替手段(私が好むと思います)は次のとおりです。

def split_string(source,separators):
    return re.split('|'.join(re.escape(x) for x in separators),source)

この場合、複数文字のセパレーターは文字列以外のイテラブル (タプルやリストなど) として渡されますが、1 文字のセパレーターは 1 つの文字列として渡すことができます。

>>> def split_string(source,separators):
...     return re.split('|'.join(re.escape(x) for x in separators),source)
... 
>>> split_string("the;foo: went to the store",':;')
['the', 'foo', ' went to the store']
>>> split_string("the;foo: went to the store",['foo','st'])
['the;', ': went to the ', 'ore']

または、最後に、セパレーターの連続した実行でも分割したい場合は、次のようにします。

def split_string(source,separators):
    return re.split('(?:'+'|'.join(re.escape(x) for x in separators)+')+',source)

与える:

>>> split_string("Before the rain ... there was lightning and thunder.", " .")
['Before', 'the', 'rain', 'there', 'was', 'lightning', 'and', 'thunder', '']
于 2013-02-06T03:25:13.627 に答える
2

問題は、その場でsource_list.replace(separator, ' ')変更されないことsource_listです。変更された文字列値を返すだけです。しかし、この変更された値に対して何もしないので、失われます。

あなたはこれを行うことができます:

source_list = source_list.replace(separator, ' ')

次にsource_list、変更されたバージョンがあります。私はあなたの機能にこの1つの変更を加え、テストしたところ完全に機能しました.

于 2013-02-06T03:23:06.890 に答える
2

source_list.replace(separator, ' ') の結果を source_list に戻すのを忘れました

この変更されたスニペットを見てください

def split_string(source, separators): 
    source_list = source
    for separator in separators:
        if separator in source_list:
                source_list=source_list.replace(separator, ' ') 
    return source_list.split()
于 2013-02-06T03:28:59.137 に答える
0

問題を解決するには分割を使用する必要があります。正規表現は必要ありませんが、必要なことを行うために機能させることができます。

サンプルコードでは、再割り当てしません。

于 2013-02-06T03:23:31.873 に答える