Python:按分隔符列表拆分字符串

时间:2011-01-14 23:24:58

标签: python regex split separator

在Python中,我想使用分隔符列表拆分字符串。分隔符可以是逗号或分号。应除去空格,除非它位于非空格,非分隔符的中间,在这种情况下应保留它。

测试案例1:ABC,DEF123,GHI_JKL,MN OP
测试案例2:ABC;DEF123;GHI_JKL;MN OP
测试案例3:ABC ; DEF123,GHI_JKL ; MN OP

听起来像是正则表达式的情况,这很好,但如果以更好的方式做到更容易或更干净。

谢谢!

4 个答案:

答案 0 :(得分:18)

这应该比正则表达式快得多,你可以根据需要传递一个分隔符列表:

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 :(得分:5)

使用正则表达式,尝试

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

根据您的测试用例,您需要使用正则表达式和一个或多个分隔字符。在你的情况下,分隔字符似乎是',','|',';'和空白。 python中的空格是'\ w',所以理解是:

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

我无法回复上面sven的回答,但我在括号内的一个或多个字符上拆分,而不必使用strip()方法。

Yikes,我没有正确地阅读这个问题...... Sven对条带的回答是肯定的;我认为空白是另一种分离。