2011-01-14 31 views
7

Pythonでは、区切り文字のリストを使用して文字列を分割したいと思います。セパレータはカンマまたはセミコロンのいずれかです。空白は非空白で区切られていない文字の途中にある場合を除き、削除する必要があります。Python:区切り文字のリストで区切り文字

テストケース1:ABC,DEF123,GHI_JKL,MN OP
テストケース2:ABC;DEF123;GHI_JKL;MN OP
テストケース3:ABC ; DEF123,GHI_JKL ; MN OP

は大丈夫です正規表現の場合、同じように聞こえるが、それは簡単またはクリーナーだ場合、それを別の方法を行うためにそれはさらに良いでしょう。

ありがとうございます!正規表現を使用して

答えて

15

これは、はるかに高速正規表現、その後でなければなりません、あなたが望んでいたとして、あなたはseperatorsのリストを渡すことができます。

それを使用する方法
def split(txt, seps): 
    default_sep = seps[0] 

    # we skip seps[0] because that's the default seperator 
    for sep in seps[1:]: 
     txt = txt.replace(sep, default_sep) 
    return [i.strip() for i in txt.split(default_sep)] 

>>> split('ABC ; DEF123,GHI_JKL ; MN OP', (',', ';')) 
['ABC', 'DEF123', 'GHI_JKL', 'MN OP'] 

性能試験:

import timeit 
import re 


TEST = 'ABC ; DEF123,GHI_JKL ; MN OP' 
SEPS = (',', ';') 


rsplit = re.compile("|".join(SEPS)).split 
print(timeit.timeit(lambda: [s.strip() for s in rsplit(TEST)])) 
# 1.6733491150007467 

print(timeit.timeit(lambda: split(TEST, SEPS))) 
# 1.6442800510003508 
+1

非常に良い。最高の答えとしてこれを選ぶ必要があります。皆さんありがとう! – blah238

+0

SOは空白を圧縮し、上の文字列に2つ以上の連続した空白があります。 – fabrizioM

+0

ありがたいことに、常にコンマまたはセミコロンのどちらかがあります。 – blah238

5

、なし

[s.strip() for s in re.split(",|;", string)] 

または

[t.strip() for s in string.split(",") for t in s.split(";")] 

を試してみてください。

+0

代わりに、文字列の 'split()'を使用して、 're'をインポートしないようにします。 'ABC、DEF123、GHI_JKL、MN OP'.split( '、|;')' – marcog

+1

@macrog:これは、文字列を ''、|; ''のすべての逐語的な出現で分割しませんか? –

+0

素晴らしい作品です!ありがとう:) – blah238

0
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf') 
['a', 'b', 'cdf'] 
0

あなたのテストケースで、正規表現を使いたい場合は、の1つ以上の分離文字を使用します。あなたの場合、分離文字は '、'、 '|'、 ';'空白。

import re 
list = [s for s in re.split("[,|;\W]+", string)] 

私は上記の答えのをスヴェンする返信することはできませんが、私は、カッコ内の文字の一つ以上に分割し、使用する必要はありません:Pythonで空白は理解があるので、「W \」ですstrip()メソッド

私は質問を正しく読まなかった...ストリップのスヴェンの答えが働く。私は空白が別の分離であると仮定します。

関連する問題