15

Python では、区切り記号のリストを使用して文字列を分割したいと考えています。区切り記号は、コンマまたはセミコロンのいずれかです。空白は、それが空白でも区切り文字でもない文字の真ん中にある場合を除き、削除する必要があります。

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

正規表現のケースのように聞こえますが、それは問題ありませんが、別の方法で行う方が簡単またはクリーンであれば、さらに良いでしょう.

ありがとう!

4

4 に答える 4

28

これは正規表現よりもはるかに高速であるはずであり、必要に応じて区切り文字のリストを渡すことができます。

def split(txt, seps):
    default_sep = seps[0]

    # we skip seps[0] because that's the default separator
    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.6242462980007986

print(timeit.timeit(lambda: split(TEST, SEPS)))
# 1.3588597209964064

そして、はるかに長い入力文字列を使用します。

TEST = 100 * 'ABC ; DEF123,GHI_JKL ; MN OP , '

print(timeit.timeit(lambda: [s.strip() for s in rsplit(TEST)]))
# 130.67168392999884

print(timeit.timeit(lambda: split(TEST, SEPS)))
# 50.31940778599528
于 2011-01-14T23:35:56.660 に答える
6

正規表現を使用して、試してください

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

また

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

それなし。

于 2011-01-14T23:27:49.583 に答える
2

上記の回答を使用して、テスト ケースで、正規表現と1 つ以上の区切り文字を使用する必要があります。あなたの場合、区切り文字は「、」、「|」、「;」のようです と空白。Python の空白は '\w' であるため、理解は次のようになります。

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

上記の sven の回答に返信することはできませんが、角かっこ内の 1 つ以上の文字で分割し、strip() メソッドを使用する必要はありません。

うーん、私は質問を正しく読んでいませんでした...ストリップでのスヴェンの答えはうまくいきます。私は、空白が別の分離であると想定しています。

于 2011-01-14T23:39:53.567 に答える
1
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf')
['a', 'b', 'cdf']
于 2011-01-14T23:36:40.387 に答える