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

考虑到上面的答案,在您的测试用例中,您希望使用正则表达式和一个或多个分隔符。在您的情况下,分隔符似乎是 ',', '|', ';' 和空白。python中的空格是'\w',所以理解是:

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

我无法回复 sven 上面的回答,但我拆分了括号内的一个或多个字符,并且不必使用 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 回答