上篇文章介绍了字符串的基本用法,本篇将介绍字符串内置函数以及进阶用法
字符串拼接
把列表中的数据拼接成一个字符串,使用字符串内置函数 string.join(seq) 方法
以 string 作为分隔符,将 seq 中所有的元素合并为一个新的字符串
示例如下:
>>> li = ['cxk', 'cxk', 'kk', 'caibi']
>>> ",".join(li)
'cxk,cxk,kk,caibi'
统计字符串中某字符出现次数
string 给我们提供 count()方法,比如字符串,“acgfds1211qdaaa”
>>> "acgfds1211qdaaa".count("a")
4
同时我们还能指定统计开始和结束的位置,还是以上面的例子演示,示例如下:
>>> "acgfds1211qdaaa".count("a",1)
3
可以看到结果为3,因为是从第 2 个字符开始统计。
字符串开头和结尾
工作中经常要判断字符串是否以某字符开头或结尾,Python 也给我们提供内置函数 startswith() endswith() 判断结果直接返回布尔值。
>>> "acgfds1211qdaaa".startswith(“a”)
True
与 string.count() 一样,startswith() 也能指定从哪个位置开始判断!这个由读者自行去验证。
对字符串进行左,右,居中对齐
- 使用字符串中的 str.ljust(), str.rjust(), str.center() 进行左右居中对齐!
以上三种方法的基本用法:
>>> s = 'abc'
>>> s.ljust(20, '=')
'abc================='
>>> s.ljust(20)
'abc '
三种方法都可以设置默认填充值
- 使用内置的 format() 方法
>>> format(s, ">20")
' abc'
>>> format(s, "<20")
'abc '
>>> format(s, "^20")
' abc '
生成随机密码
问题是这样的:一行代码随机生成字母、数字和特殊字符组成的密码
看到上述问题,可能很多人会将 ”0123456...abcdefg..." 写出来,然后利用 random 模块随机选择生成,其实没有必要那么麻烦。 string 内置了生成字母和阿拉伯数字的方法,我们来控制台看下
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> string.digits
'0123456789'
看到了吧,它还可帮忙自动生成大写或者小写字母。那么特殊符号有没有提供生成的方法呢?当然有!
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
那么上面这个问题就会变得很简单了,直接放代码
>>> ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 10))
'6JX,VYdrTa'
上面代码是意思是随机生成10位由数字、字母和特殊字符组成的密码!另外上面代码用到 random 模块,这是一个随机选择的模块。
拆分含有多种分隔符的字符串
把某个字符串依据分割符号拆分不同的字段,该字符串包含多种不同的分隔符
- 使用 string.split() 方法,由于 split 一次只能处理一个分隔符,例如:
>>> res = s.split(';')
['ab', 'fd/ft|fs,f\tdf.fss*dfd', 'fs:uu}fsd']
所以我们需要根据字符串中的分隔符,依次分割,可以是 map 函数!
>>> list(map(lambda x: x.split("|"), res))
[['ab'], ['fd/ft', 'fs,f\tdf.fss*dfd'], ['fs:uu}fsd']]
结果变成了一个二维列表,而我们想要的结果是一维列表,怎么办?
创建一个临时列表保存结果。
>>> t = []
>>> list(map(lambda x: t.extend(x.split("|")), res))
[None, None, None]
>>> t
['ab', 'fd/ft', 'fs,f\tdf.fss*dfd', 'fs:uu}fsd']
结果符合我们的预期!接下来继续处理剩余的分隔符,重复动作,用 for 循环搞定!
最终代码如下:
def my_split(s, ds):
res = [s]
for d in ds:
t = []
list(map(lambda x: t.extend(x.split(d)), res))
res = t
return res
将字符串和字符串中所有的分隔符传入,结果如下:
s = "ab;fd/ft|fs,f\tdf.fss*dfd;fs:uu}fsd"
print(my_split(s, ";/|,.}:*\t"))
运行结果:['ab', 'fd', 'ft', 'fs', 'f', 'df', 'fss', 'dfd', 'fs', 'uu', 'fsd']
上面的方法相对来说有点复杂了,下面介绍一种更优雅的方法!
- 使用 re 模块的中 split() 方法
re() 也给我们提供了 split() 方法,可以一次性分隔字符串!
import re
s = "ab;fd/ft|fs,f\tdf.fss*dfd;fs:uu}fsd"
print(re.split('[;/|,.}:*\t]', s))
运行结果:['ab', 'fd', 'ft', 'fs', 'f', 'df', 'fss', 'dfd', 'fs', 'uu', 'fsd']
结果是一致的,相比第一种方法更加简单!

网友评论