字符串
- 一个个字符组成的有序的序列,是字符的集合
- 使用单引号、双引号、三引号引住的字符序列
- 字符串是不可变对象
- Python3起,字符串就是Unicode类型
字符串定义 初始化
- 示例
s1 = 'string' print(s1)#运行结果为:string s2 = "string2" print(s2)#运行结果为:string2 s3 = '''this's a "String" ''' print(s3)#运行结果为:this's a "String" s4 = 'hello \n magedu.com' print(s4) #运行结果为: #hello # magedu.com s5 = r"hello \n magedu.com" print(s5)#运行结果为:hello \n magedu.com s6 = 'c:\windows\nt' print(s6) #运行结果为: #c:\windows #t s7 = R"c:\windows\nt" print(s7)#运行结果为:c:\windows\nt s8 = 'c:\window\\nt' print(s8)#运行结果为:c:\window\nt name = 'tom';age = 20 print(name,age)#运行结果为:tom 20 s9 = f'{name},{age}'#3.6支持前缀 print(s9)#运行结果为:tom,20 sql = """select *from user where name ='tom'""" print(sql)#运行结果为:select *from user where name ='tom'
字符串元素访问——下标
- 字符串支持使用访问索引
sql = "select *from user where name = 'tom'" sql[4]#运行结果为:'c' sql[4] = 'o'# 这里会抛出TypeError
- 有序的字符集合,字符序列
运行结果for c in sql : print(c) print(type(c))
s <class 'str'> e <class 'str'> l <class 'str'> e <class 'str'> c <class 'str'> t <class 'str'> <class 'str'> * <class 'str'> f <class 'str'> r <class 'str'> o <class 'str'> m <class 'str'> <class 'str'> u <class 'str'> s <class 'str'> e <class 'str'> r <class 'str'> <class 'str'> w <class 'str'> h <class 'str'> e <class 'str'> r <class 'str'> e <class 'str'> <class 'str'> n <class 'str'> a <class 'str'> m <class 'str'> e <class 'str'> <class 'str'> = <class 'str'> <class 'str'> ' <class 'str'> t <class 'str'> o <class 'str'> m <class 'str'> ' <class 'str'>
- 可迭代
运行结果lst = list(sql) lst
['s', 'e', 'l', 'e', 'c', 't', ' ', '*', 'f', 'r', 'o', 'm', ' ', 'u', 's', 'e', 'r', ' ', 'w', 'h', 'e', 'r', 'e', ' ', 'n', 'a', 'm', 'e', ' ', '=', ' ', "'", 't', 'o', 'm', "'"]
字符串join连接
- “string”.join(iterable) -> str
- 将可迭代对象连接起来,使用String作为分隔符
- 可迭代对象本身元素都是字符串
- 返回一个新字符串
- 示例
lst = ['1','2','3'] print("\"".join(lst))#运行结果为:1"2"3 print(" ".join(lst))#运行结果为:1 2 3 print("\n".join(lst))#运行结果为:1 \n2 \n3 lst = ['1',['a','b'],'3'] print(" ".join(lst))#抛出TypeError#解决方法" ".join(map(str,lst))
字符串+连接
- + -> str
- 将2个字符串连接在一起
- 返回一个新字符串
字符串分割
- 分割字符串的方法分为2类
- split系
将字符串按照分隔符分割成若干字符串,并立即返回列表(立即表示不是惰性的) - partition系
将字符串按照分隔符分割成2段,返回这2段和分隔符的元组(立即返回一个三元组)(三元组,三个元素的元组) - splitlines([keepends]) -> list of strings
- 按照行来切分字符串
- keepends指的是是否保留行分隔符
- 行分隔符包括\n 、\r\n、 \r等
'ab c\n\nde fg\rkl\r\n'.splitlines()#运行结果为:['ab c', '', 'de fg', 'kl'] 'ab c\n\nde fg\rkl\r\n'.splitlines()#运行结果为:['ab c', '', 'de fg', 'kl'] s1 = '''I'm a super student. You're a super teacher.''' print(s1)#运行结果为: #I'm a super student. #You're a super teacher. print(s1.splitlines())#运行结果为:["I'm a super student.", "You're a super teacher."] print(s1.splitlines(True))#运行结果为:["I'm a super student.\n", "You're a super teacher."]
- split系
字符串大小写
- upper()
- 全大写
- lower()
- 全小写
- 大小写,做判断的时候用
- swapcase()
- 交换大小写
字符串排版
- title() -> str
- 标题的每个单词都大写
- capitalize() -> str
- 首个单词大写
- center(width[,fillchar]) -> str
- width 打印宽度
- fillchar 填充的字符
- zfill(width) -> str
- width 打印宽度,居右,左边用0填充
- ljust(with[,fillchar]) -> str 左对齐
- rjust(width[,fillchar]) -> str 右对齐
- 中文用的少,了解一下
字符串修改
- replace(old,new[,count]) -> str
- 字符串中找到匹配替换为新子串,返回新字符串
- count表示替换几次,不指定就是全部替换
- 示例
'www.magedu.com'.replace('w','p')#运行结果为:'ppp.magedu.com' 'www.magedu.com'.replace('w','p',2)#运行结果为:'ppw.magedu.com' 'www.magedu.com'.replace('w','p',3)#运行结果为:'ppp.magedu.com' 'www.magedu.com'.replace('ww','p',2)#运行结果为:'pw.magedu.com' 'www.magedu.com'.replace('www','python',2)#运行结果为:'python.magedu.com'
- strip([chars]) -> str
- 从字符串两端去除指定的字符集chars中的所有字符
- 如果chars没有指定,去除两端的空白字符
- 示例
s = "\r \n \t Hello Python \n \t" s.strip()#运行结果为:'Hello Python' s = "I am very very very sorry" s.strip('ly')#运行结果为:'I am very very very sorr' s.strip('Iy')#运行结果为:' am very very very sorr'
- lstrip([chars]) -> str
- 从左开始
- rstrip([chars]) -> str
- 从右开始
字符串查找
- 时间复杂度
- index和count方法都是O(n)
- 随着列表数据规模的增大,而效率下降
- len(string)
- 返回字符串的长度,即字符的个数
- count(sub[,start[,end]) -> int
- 在指定的区间 [start,end),从左至右,统计子串sub出现的次数
s = "I am very very very sorry" s.count("very")#运行结果为:3 s.count('very',5)#运行结果为:3 s.count('very',10,14)#运行结果为:1
- 在指定的区间 [start,end),从左至右,统计子串sub出现的次数
- index(sub[,start[,end]) -> int
- 在指定的区间 [start,end),从左至右,寻找子串sub,找到返回索引,没找到抛出异常ValueError
- rindex(sub[,start[,end]) -> int
- 在指定的区间 [start,end),从右至左,查找子串,找到返回索引,没找到抛出异常ValueError
s = "I am very very very sorry" s.index("very")#运行结果为:5 s.index("very",5)#运行结果为:5 s.index('very',6,13)#运行结果为:抛出ValueError s.rindex('very',10)#运行结果为:15 s.rindex('very',10,15)#运行结果为:10 s.rindex('very',-10,-1)#运行结果为:15
- 在指定的区间 [start,end),从右至左,查找子串,找到返回索引,没找到抛出异常ValueError
- find(sub[,start[,end]) -> int
- 在指定的区间 [start, end),从左至右,寻找子串,找到返回索引,没找到返回-1
- rfind(sub[,start[,end]) -> int
- 在指定的区间 [start, end),从右至左,查找子串,找到返回索引,没找到返回-1
s = "I am very very very sorry" s.find("very",5)#运行结果为:5 s.find("very",6,13)#运行结果为:-1 s.rfind('very',10)#运行结果为:15 s.rfind('very',10,15)#运行结果为:10 s.rfind('very',-10,-1)#运行结果为:15
- 在指定的区间 [start, end),从右至左,查找子串,找到返回索引,没找到返回-1
- partition(sep) -> (head,sep,tail)
- 从左至右,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组;如果没有找到分隔符,就返回头、两个空元素的三元组
- sep 分割字符串,必须指定
s1 = "I am a super student"
s1.partition('s')#运行结果为:('I am a ', 's', 'uper student')
s1.partition('stu')#运行结果为:('I am a super ', 'stu', 'dent')
s1.partition('')#运行结果为:抛出ValueError
s1.partition('abc')#运行结果为:('I am a super student', '', '')
-
rpartition(sep) -> (head,sep,tail)
- 从右至左,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组,如果没有找到分隔符,就返回2个空元素和三元组
-
split(sep=None, maxsplit=-1) -> list of strings
- 从左至右
- sep指定分割字符串,缺省的情况下空白字符串作为分隔符
- maxsplit指定分割的次数,-1表示遍历整个字符串
s1 = "I'm \ta super student" s1.split()#运行结果为:["I'm", 'a', 'super', 'student'] s1.split('s')#运行结果为:["I'm \ta ", 'uper ', 'tudent'] s1.split('super')#运行结果为:["I'm \ta ", ' student'] s1.split('super ')#运行结果为:["I'm \ta ", 'student'] s1.split(' ')#运行结果为:["I'm", '\ta', 'super', 'student'] s1.split(' ',maxsplit=2)#运行结果为:["I'm", '\ta', 'super student']
-
rsplit(sep=None, maxsplit=-1) -> list of strings
- 从右至左
- sep指定分隔字符串,缺省的情况下空白字符串作为分隔符
- maxsplit指定分割的次数,-1表示遍历整个字符串
s1 = "I'm \ta super student"
s1.rsplit()#运行结果为:["I'm", 'a', 'super', 'student']
s1.rsplit('s')#运行结果为:["I'm \ta ", 'uper ', 'tudent']
s1.rsplit('super')#运行结果为:["I'm \ta ", ' student']
s1.rsplit('supter ')#运行结果为:["I'm \ta super student"]
s1.rsplit(' ')#运行结果为:["I'm", '\ta', 'super', 'student']
s1.rsplit(' ',maxsplit=2)#运行结果为:["I'm \ta", 'super', 'student']
字符串判断
- endswith(suffic[,start[,end]]) -> bool
- 在指定的区间[start,end),字符串是否是suffix结尾
- startswith(prefix[,start[,end]]) -> bool
- 在指定的区间[start,end),字符串是否是prefix开头
- 示例
s = "I am very very very sorry" s.startswith('very')#运行结果为:False s.startswith('very',5)#运行结果为:True s.startswith('very',5,9)#运行结果为:True s.endswith('very',5,9)#运行结果为:True s.endswith('sorry',5)#运行结果为:True s.endswith('sorry',5,-1)#运行结果为:False s.endswith('sorry',5,100)#运行结果为:True
字符串判断is系列
- isalnum() -> bool 是否是字母和数字组成
- isalpha() 是否是字母
- isdecimal() 是否包含十进制数字
- isdigit() 是否全部数字(0~9)
- isidentifier() 是不是字母和下划线开头,其他都是字母、数字、下划线
- islower() 是否都是小写
- isupper() 是否全部大写
- isspace() 是否只包含空白字符
字符串格式化
- 字符串的格式化是一种拼接字符串输出样式的手段,更灵活方便
- join拼接只能使用分隔符,且要求被拼接的是可迭代对象且其元素是字符串
- + 拼接字符串还算方便,但是非字符串需要先转换为字符串才能拼接
- 在2.5版本之前,只能使用printf style风格的print输出
- printf-style formatting ,来自于C语言的printf函数
- 格式要求
- 占位符:使用%和格式字符组成,例如%s、%d等
- s调用str(),r会调用repr()。所有对象都可以被这两个转换。
- 占位符中还可以插入修饰字符,例如%03d表示打印3个位置,不够后面补零
- format % values,格式字符串和被格式的值之间使用%分隔
- values只能是一个对象,或是一个与格式字符串占位符数目相等的元组,或是一个字典
- 占位符:使用%和格式字符组成,例如%s、%d等
- printf-style formatting 举例
"I am %03d"%(20,)#运行结果为:'I am 020' 'I like %s.'%'Python'#运行结果为:'I like Python.' "%3.2f%% 0x%x %#X"%(89.7654,10,256)#运行结果为:'89.77% 0xa 0X100' "I am %-5d"%(20,)#运行结果为:'I am 20 '
format函数格式字符串语法——Python鼓励使用
-
“{}{xxx}”.fromat(*args,**kwargs) -> str
- args是可变位置参数,是一个元组
- kwargs是可变关键字参数,是一个字典
- 花括号表示占位符
- {}表示按照顺序匹配位置参数,{n}表示取位置参数索引为n的值
- {xxx}表示在关键字参数中搜索名称一致的
- {{}}表示打印花括号
-
对齐
'{0}*{1} = {2:<2}'.format(3,2,2*3)#运行结果为:'3*2 = 6 ' '{0}*{1} = {2:<02}'.format(3,2,2*3)#运行结果为:'3*2 = 60' '{0}*{1} = {2:>02}'.format(3,2,2*3)#运行结果为:'3*2 = 06' '{:^30}'.format('centered')#运行结果为:' centered ' '{:*^30}'.format('centered')#运行结果为:'***********centered***********'
-
进制
"int:{0:d};hex:{0:x};oct:{0:o};bin:{0:b}".format(42)#运行结果为:'int:42;hex:2a;oct:52;bin:101010' "int:{0:d};hex:{0:#x};oct:{0:#o};bin:{0:#b}".format(42)#运行结果为:'int:42;hex:0x2a;oct:0o52;bin:0b101010' octers = [192,168,0,1] '{:02X}{:02X}{:02X}{:02X}'.format(*octers)#运行结果为:'C0A80001'
-
浮点数
"{}".format(3**0.5)#运行结果为:'1.7320508075688772' "{:f}".format(3**0.5)#运行结果为:'1.732051'#默认精度6 "{:10f}".format(3**0.5)#运行结果为:' 1.732051'#右对齐,宽度10 "{:2}".format(102.231)#运行结果为:'102.231'#宽度为2 "{:.2}".format(3**0.5)#运行结果为:'1.7'#两个数字,科学计数法 "{:.2f}".format(3**0.5)#运行结果为:'1.73'#小数点后两位 "{:3.2f}".format(3**0.5)#运行结果为:'1.73'#宽度为3,小数点后2位 "{:20.3f}".format(3**0.5)#运行结果为:' 1.732' "{:3.3%}".format(1/3)#运行结果为:'33.333%'
注意:
宽度可以被撑破,精度优先