实际案例
我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如:
s='ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'
其中<,>, <;>, <|>, <\t>都是分隔符号,如何处理?
解决方案:
- 连续使用str.split(),每一次处理一种分隔符号;
- 使用正则表达式的re.split(),一次性拆分字符串。
我们先使用方法一看看处理效果是否满足实际案例需求,其代码如下所示:
# -*- coding: utf-8 -*-
def mySplit(s, ds):
res = [s]
for d in ds:
t = []
map(lambda x: t.extend(x.split(d)), res)
res = t
return res
if __name__ == "__main__":
s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'
print mySplit(s, ';,|\t')
其输出结果为:
['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']
虽然,我们将分隔符号给处理掉了, 但如果有两个连续的分隔符号,这种方法就会出现异常,如:s='ab;cd|efg|hi,,;jkl|mn\topq;rst,uvw\txyz',其运行结果如下:
['ab', 'cd', 'efg', 'hi', '', '', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']
我们会发现结果列表中多出两个空字符。假设我们需要不含空字符的结果列表,那么我们又要对结果列表中的空字符进行处理,其代码如下:
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]
其输出结果为:
['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']
因此, 我们这里推荐采用方法二对分隔符进行处理,其代码如下:
# -*- coding: utf-8 -*-
import re
s = 'ab;cd|efg|hi,,;jkl|mn\topq;rst,uvw\txyz'
print re.split(r'[,;\t|]+', s)
其输出结果为:
['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']
注:代码中字符串前添加r时为了防止'\t'这种转义字符被转义。关于正则表达式部分此处不详细说明,如有兴趣可参考菜鸟教程网。
通过上述两个方法,我们可以了解到:当我们处理单个分隔符时,推荐使用str.split();当我们对多个分隔符进行处理时,推荐使用re.split()。