3.1 拆分含有多种分隔符的字符串
实际场景
我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如:
s = 'ab;cd|efg|hi,jkl|mn\topg;rst,uvw\txyz'
其中,
,;
,|
,\t
都是分隔符号,应该如何处理?
解决方案一:连续使用str.split()
split
方法在这种问题下是不适用的,如
s.split(';,|\t')
这里它会把;,|\t
看成整体的一个字符串进行分割。
但是我们可以连续使用该方法,每次只处理一种分隔符号。
s = 'ab;cd|efg|hi,jkl|mn\topg;rst,uvw\txyz'
res = s.split(';')
t = []
map(lambda x: t.extend(x.split('|')), res)
res = t
t = []
map(lambda x: t.extend(x.split(',')), res)
res = t
t = []
map(lambda x: t.extend(x.split('\t')), res)
或者写一个循环优化它:
s = 'ab;cd|efg|hi,jkl|mn\topg;rst,uvw\txyz'
def mySplit(s, ds):
res = [s]
for d in ds:
t = []
map(lambda x: t.extend(x.split(d)), res)
res = t
return res
print mySplit(s, ';,|\t')
但是会存在一个问题,比如有连续有个分隔符连在一起,那就会返回一个空的字符串。如果不想要空的结果,实现一个过滤即可。
s = 'ab;cd|efg|hi,jkl|mn\topg;rst,uvw\txyz'
def mySplit(s, ds):
res = [s]
for d in ds:
t = []
map(lambda x: t.extend(x.split(d)), res)
res = t
return [x for x in res if x]
print mySplit(s, ';,|\t')
那又没有更又优雅的方法呢?答案是有的。
解决方案二:使用正则表达式的re.split()
re.split(r'[,;\t|]+', s)