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

bla*_*238 9 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

听起来像正则表达式的情况,这很好,但如果它更容易或更干净,以另一种方式,甚至更好.

谢谢!

Jos*_*hua 20

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

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)]
Run Code Online (Sandbox Code Playgroud)

如何使用它:

>>> split('ABC ; DEF123,GHI_JKL ; MN OP', (',', ';'))
['ABC', 'DEF123', 'GHI_JKL', 'MN OP']
Run Code Online (Sandbox Code Playgroud)

性能测试:

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
Run Code Online (Sandbox Code Playgroud)

  • 这种比较是有缺陷的:它每次通过循环编译正则表达式.如果在循环之外正确编译正则表达式(`r = re.compile(",|;")`),则正则表达式版本更快.这也是一个清晰,普通,灵活的解决方案,每个人都能立即理解,这是一个比性能更强大的论点. (6认同)
  • 而不是使用default_sep作为参数,只需使用其中一个seps.例如:`default_sep = seps [0]`然后将`for`行改为`for sep in seps [1:]:`. (2认同)
  • 这取决于调用者事先知道某个字符(例如“ |”)永远不会出现在输入中。这很容易发生灾难。 (2认同)

Sve*_*ach 6

使用正则表达式,尝试

[s.strip() for s in re.split(",|;", string)]
Run Code Online (Sandbox Code Playgroud)

要么

[t.strip() for s in string.split(",") for t in s.split(";")]
Run Code Online (Sandbox Code Playgroud)

没有.