例如,某个字符串包含多种不同的分隔符,如:

s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'

其中,;|\t都是分隔符号。

要求:把该字符串根据分隔符号拆分不同的字段。

解决方案:

  1. 连续使用字符串的split()方法,每次处理一种分隔符号;

  2. 使用正则表达式的re.split()方法(推荐)。


  • 对于split()方法:
t = ''t.split(sep, maxsplit)

返回一个字符串中单词组成的列表,使用sep作为分隔符字符串。

sep表示用来分割字符串的分隔符,None(默认值)表示根据任何空格进行分割;maxsplit表示最大分割次数,-1(默认值)表示没有限制。

  • 对于extend()方法:
t = []t.extend(iterable)

extend()方法用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表),可将多维列表转换为一维列表。

  • 对于sum()方法:
`sum()`用于求和,iterable, start)

sum()用于求和,默认start=0。对于一个多维列表,可以将start=[],这样可以得到一个一维列表。


  • 方案1示例:
s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'def my_split(s, seps):
    res = [s]
    for sep in seps:
        t = []
        list(map(lambda ss: t.extend(ss.split(sep)), res))
        res = t    return res

answer = my_split(s, ',;|\t')print(answer)['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']              #结果

上面的方法可行,但使用reduce更为简单。

from functools import reduces = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'def my_split(s, seps):
    res = reduce(lambda t, sep: sum(map(lambda ss: ss.split(sep), t), []), seps, [s])
    return res

answer = my_split(s, ',;|\t')print(answer)['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']              #结果


  • 方案2示例:
import re

s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'answer = re.split('[,;|\t]+', s)print(answer)['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']              #结果

可以看到,在处理多种分隔符时,方案2比方案1更为简便。当然,对于单个分隔符的处理,建议使用split()方法而不是re.split()方法。