- python中字符串的分割可以用Python自带的split属性:
例如:
s='abcd/efdkk|hkkll,hooll'
s.split()
输出结果为
['abcd/efdkk|hkkll,hooll']
这里面调用了python自带的split()方法,默认输入的分隔符号是: 空格,tab等空字符
当然也可以通过指定分隔符号改变分隔方法:
s.split('|')
输出为:
['abcd/efdkk', 'hkkll,hooll']
这就是指定‘|’为分隔符号时,split()方法根据’|'分隔字符串
以上是简单的分隔字符串的方法,但是split()方法有一个缺点,就是一次只能传入一个分隔字符。如果现在我们的需求是将字符串:
s='abcd/efdkk|hkkll,hooll'
根据符号:’,’ ‘|’ ‘/’ 这三个符号将s分隔成
['abcd', 'efdkk', 'hkkll', 'hooll']
这样的目标形式,split()方法就无能为力了。
- 使用正则表达式。
import re #正则表达式
re.split('[|,/]',s)
#正则表达式中也有split方法,该语句表示,将s字符串按集合
#[|,/] 中的元素分隔。[|,/]表示该集合下包括/ ,| 三个符号,正则表达式的方法将按照该集合中的字符将字符串分开
结果如下:
['abcd', 'efdkk', 'hkkll', 'hooll']
- 是否可以通过python 自带的split()方法实现呢?
答案是肯定的,先上代码:
def allsplit(s,ds):
res=[s]
for d in ds:
t=[]
list(map(lambda x: t.extend(x.split(d)),res))
res=t
return t
s='abcd/efdkk|hkkll,hooll'
ds='\/|,'
print(allsplit(s,ds))
运行结果:
['abcd', 'efdkk', 'hkkll', 'hooll']
这里面用到了python中的容器函数map() 匿名函数 lambda 列表扩展方法extend。做一些必要说明:
map(function,iterable object):
容器函数map() 作用是对可迭代对象中的每一个元素均实现同样的操作
举例:
def add(x):
add=x+1
return add
print(list(map(add,[1,2,3,4])))
map函数将可迭代对象[1,2,3,4]中每个元素加上1
输出结果为:
[2, 3, 4, 5]
这里值得一提的就是python3中的map函数和python2 中的map的区别,在python2中,map 函数返回的就是一个列表,如果是在python2中,输出可以直接写成:
print map(add,[1,2,3,4])
但是在python3 中,map函数返回的是一个可迭代对象,如果直接使用
print(map(add,[1,2,3,4]))
那么打印出的值为:
<map object at 0x000001F0D05F32E8>
因此在代码中使用了list()将该可迭代对象转化成list后,才能显示出想要的结果。
匿名函数lambda
该函数使用方法如下:
lambda varibles: function
举例:
f=lambda x:x+1
print(f(1))
输出如下:
2
匿名函数常常应用于函数的闭包。
有了以上的基础储备,重新审视代码:
def allsplit(s,ds):
res=[s]
#将s字符串转化成列表['abcd/efdkk|hkkll,hooll']
for d in ds:
# ds是'\/|,' ,d依次为'\','/',',',每次通过d将s分隔成按相应字符串分隔
#的字符串列表
t=[]
#t在每次循环都重新初始化
list(map(lambda x: t.extend(x.split(d)),res))
#python3中需要将map对象转化成list,否则,t没有变化
#map(lambda x: t.extend(x.split(d)),res)作用是将传入的res字
#串列表按照d字符分隔,例如:如果res=['abcd','efdkk|hkkll,holl']
#经过此行,d如果为|,res字符串:res=['abcd','efdkk|hkkll,holl']转化为
#['abcd','efdkk','hkkll,holl'],这些字符串都被扩展到t对象中(t.extend(x.split(d)))
res=t
#更新res, 所以循环下一次传入的res值是已经按照上一个字符分隔好的字符串列
#表
return t
s='abcd/efdkk|hkkll,hooll'
ds='\/|,'
print(allsplit(s,ds))
输出结果
['abcd', 'efdkk', 'hkkll', 'hooll']
总结,用正则表达式可以快捷地分隔字符串,这里不厌其烦地使用python自带split()主要是为了应用python中一些特性,实战中正则表达式是王道。