例如,某个字符串包含多种不同的分隔符,如:
s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'
其中,
、;
、|
、\t
都是分隔符号。
要求:把该字符串根据分隔符号拆分不同的字段。
解决方案:
连续使用字符串的
split()
方法,每次处理一种分隔符号;使用正则表达式的
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()
方法。