数据类型详解-字符串
1.转义字符
一个普通的字符出现在转义符 \ 的后面时,实现了另外一种意义
-
\ 转义符,续行符。
作为续行符时,在行尾使用了\后,可以换行继续书写内容;
a = '123'\ '12' print(a) >>>12312
作为转义符时,在\后面出现的字符可能会实现另外一种意义:
-
\n 换行符
a = '123\n12' print(a) >>>123 12
-
\r 代表光标位置(从\r出现的位置开始作为光标的起点)
a = '123\r45' print(a) >>>45
-
\t 代表一个水平制表符(table 缩进)
a = '123\t45' print(a) >>>123 45
-
\b 退格符
a = '123\b45' print(a) >>>1245
-
\\
反转义\,输出了\,取消\的转义效果a = '123\\n45' print(a) >>>123\n45
把转义字符作为普通字符输出,在字符串的前面加 r
a = r'123\n45'
print(a)
>>>123\n45
2.字符串相关的操作
字符串的索引操作,字符串中只能使用[]下标访问,不能修改
-
字符串 + 操作:‘a’ + ‘b’ >>> ‘ab’
-
字符串 * 操作:‘a’ * 5 >>>‘aaaaa’
-
字符串 [] 切片
- str[开始值:结束值:步进值]
开始值:默认为0,结束值默认是最后一个下标,步进值默认为1
a = '0123456789' print(a[5]) >>>5 print(a[-4]) #没有倒数第0个这种说法,倒数第1个就是倒数第1个 >>>6 print(a[5:]) >>>56789 print(a[-4::]) >>>6789 print(a[0:3]) #遵循左闭右开,取不到下标为3的值 >>>123 print(a[0:5:2]) #从0到下标4,隔1个取一个 >>>024 print(a[::-1]) #反转字符串 >>>9876543210 print(a[::-3]) #反转字符串,隔两个取一个 >>>9630 print(a[1::3]) #从下标1开始,隔两个取一个 >>>147 【注意!!反转之后的开始值也要从索引大的往索引小的取!】 print(a[1:5:-1]) 【此时输出为空】 print(a[5:1:-1]) #这样写才是正确的! >>>5432
- str[开始值:结束值:步进值]
3.字符串格式化的方法
-
format
a = '1' b = 'a' print('{}234,{}'.format(a,'cc')) #1.普通方式 >>>1234,cc print('{n}234,{c}'.format(n=a,c='cc')) #2.关键字传参 >>>1234,cc print('{1}234,{0}'.format(a,b)) #3.通过索引传参 >>>a234,1 a = 'A:{} ,B:{} ,C:{} '.format('1',[2],['3']) print(a) #注意这里的输入和输出 >>>A:1 ,B:[2] ,C:['3'] a = 'A:{0[1]} ,B:{0[2]} ,C:{0[0]} '.format(['1','2','3']) print(a) #这里0[1]的0指的是format里下标为0的容器类型数据 >>>A:2 ,B:3 ,C:1 tmp = {'a':'11','b':'22'} a = '{a},{b}'.format(**tmp) print(a) >>>11,22 #这里的a还可以写成 a = '{a},{b}'.format(a = tmp["a"],b = tmp['b']) >>>11,22 【注意!format()里可以不用管引号嵌套问题,tmp["a"]和tmp['b']都可以拿到字典里的键,但是f''里就必须要注意引号嵌套!
-
f python3新增方法
tmp = {'a':'11','b':'22'} a = f'{tmp["a"]}345' print(a) >>>11345 #这里如果是f'{tmp['a']}345'就会报错
a = 12.356478 print('{:.2f}'.format(a)) #限定小数的位数 >>>12.36
4.字符串相关函数
4.1大小写转换函数与字符检测相关函数
#大小写转换相关函数
vars = 'iloveyou'
# 把字符串的首个字符大写,其余小写。
res = vars.capitalize()
# 把字符串中的每个单词的首字母大写
res = vars.title()
# 把字符串中的英文字母全部转为大写
res = vars.upper()
# 把字符串中的英文字母全部改为小写
res = vars.lower()
# 字符串中的大小写字符转换,大写转小写,小写转大写
res = vars.swapcase()
#字符检测相关函数
str = 'iloveyou'
# 检测字符串中的英文字符否全部由大写字符组成
res = str.isupper()
# 检测字符串中的英文字符否全部由小写字符组成
res = str.islower()
# 检测字符串中的英文单词部分是否符合title:是否每个单词首字母都大写
res = str.istitle()
#检测字符串是否全部由字符(中文,英文字符,数字)组成:【有空格就是False】
res = str.isalnum()
# 检测当前的字符串是否由中英文字符组成(不包含数字和其它字符)
res = str.isalpha()
# 检测当前的字符串是否由只数字字符组成
res = str.isdigit()
【注意和str.isnumeric()的区别】
# 检测当前的字符串是否由指空格字符组成
res = str.isspace()
# 检测字符串是否以指定的字符开始的,也可以指定开始和结束的位置
str = 'iloveyou'
res1 = str.startswith('ilov')
res2 = str.startswith('y')
res3 = vars.startswith('l',1)
print(res1)
print(res2)
print(res3)
>>>True
False
True
# 检测字符串是否以指定的字符结束的,也可以指定开始和结束的位置
str = 'iloveyou'
res1 = str.endswith('you')
res2 = vars.endswith('y')
res3 = vars.endswith('love',0,5) #左闭右开,从0开始,下标4为结束
res4 = vars.endswith('e',1,5)
print(res1)
print(res2)
print(res3)
print(res4)
>>>True
False
True
True
4.2 【重点】字符串查找相关函数
#检测一个字符串是否存在于一个字符串中
print('a' in str) #在就是True,不在就是False
#获取字符串长度
len()函数
#获取指定字符在字符串中第一次出现的索引位置,未找到则返回 -1
str.find(sub[, start[, end]]) #从左向右找
#find()把输入的参数看作一个整体
a = 'cxyabcdefcxy'
res = a.find('xy')
print(res)
>>>1 #获取【第一次出现】的【索引】
res1 = a.find('xy',5,12) #开始位置为5,结束位置为下标11
res2 = a.find('xy',5,11)
res3 = a.find('x',10,11)
res4 = a.find('x',5,10) #x下标为10,此时返回为-1
print(res1,res2,res3,res4)
>>>10 -1 10 -1
str.rfind(sub[, start[, end]]) #从右向左找
a = 'cxyabcdefcxy'
res = a.rfind('xy')
print(res)
>>>10
#开始结束位置的用法和find一样
str.index(),和str.find()一样,只不过未找到则报错
str.rindex(),和str.rfind()一样,未找到则报错
str.count(sub[, start[, end]])
#统计一个字符在字符串中出现的字符
a = 'cxyabcdefcxy'
res = a.count('x')
print(res)
>>>2
4.3 【重点】字符串操作相关函数
【补充!还有一个,加在最前面好了】
【str.splitlines()】,返回值的类型为【列表】
str.splitlines() #按照\n分隔
等于str.split('\n')
【不不不,不完全等于】
#括号里默认为False,就是按照行分隔,如果为str.splitlines(True)则保留换行符
a = ' 123 \n 456 \n 789\n'
b = a.splitlines()
print(b)
c = a.split('\n')
print(c)
>>>[' 123 ', ' 456 ', ' 789']
[' 123 ', ' 456 ', ' 789', '']
#注意这里的不同!
#如果字符串不是以\n结尾的,那么这两个函数的输出就是一样的
a = ' 123 \n 456 \n 789'
b = a.splitlines()
print(b)
c = a.split('\n')
print(c)
>>>[' 123 ', ' 456 ', ' 789']
[' 123 ', ' 456 ', ' 789']
str.split() #按照指定的分隔符,把字符串分隔成【列表】
a = 'cxy_abc_def_cxy'
res = a.split('_')
print(res)
>>>['cxy', 'abc', 'def', 'cxy']
a = 'cxy=123*abc=345*def=cxy'
res = a.split('*')
print(res)
for i in res:
print(i.split('='))
a = i.split('=')
print(a[0])
print(a.pop())
>>>['cxy=123', 'abc=345', 'def=cxy']
['cxy', '123']
cxy
123
['abc', '345']
abc
345
['def', 'cxy']
def
cxy
a = 'cxy=123*abc=345*def=cxy'
res = a.split('*',1) #可以指定分割的次数
print(res)
>>>['cxy=123', 'abc=345*def=cxy']
str.rsplit() #从右向左进行,从后向前
a = 'cxy=123*abc=345*def=cxy'
res = a.rsplit('*',1) #从右向左,分割1次
print(res)
>>>['cxy=123*abc=345', 'def=cxy']
'指定字符'.join(str) #按照指定的字符,把容器类型中的数据链接成一个【字符串】
a = ['cxy', 'abc', 'def', 'cxy']
res = '='.join(a)
print(res)
>>>cxy=abc=def=cxy
str.strip() #可以去除字符串【左右两侧】的指定字符
#strip()和find()不一样,不是把传入参数看作整体,而是看作字符串,只要是在里面的,都删
a = '###cxyis##cxy##'
res = a.strip('#')
print(res)
>>>cxyis##cxy
a = '###cxyis##cxy##'
res = a.strip('#c123')
print(res)
>>>xyis##cxy
str.lstrip() 去除字符串左侧的指定字符
str.rstrip() 去除字符串右侧的指定字符
str.replace(old,new[,count]) #把所有的子字符串old替换成new,如果出现了参数count,就只替换前count次
a = 'cxyiscxy'
res = a.replace('cxy','xka')
res1 = a.replace('cxy','xka',1)
print(res,res1)
>>>xkaisxka xkaiscxy
str.center()
a = 'cxy'
res = a.center(10)
res1 = a.center(10,'*')
print(res)
print(res1)
>>> cxy
***cxy****
res = a.ljust(10)
res1 = a.rjust(10,'*')
print(res)
print(res1)
>>>cxy
*******cxy
补充
encode() #以指定的编码格式编码字符串
str = '陈心怡'
print(str.encode('UTF-8'))
>>>b'\xe9\x99\x88\xe5\xbf\x83\xe6\x80\xa1'
str.isnumeric() #检查字符串是否只由数字字符组成
#和 str.isdigit()的区别:
str.isnumeric()里的数字包括:Unicode 数字,全角数字(双字节),罗马数字,汉字数字。
str = '123一二三'
print(str.isdigit())
print(str.isnumeric())
>>>False
True
max(str) #返回字符串中最大的字符
str = 'zcxy'
print(max(str))
>>>z
min(str) #返回字符串中最小的字符
str = 'zacxy'
print(min(str))
>>>a
作业
输入一行字符,分别统计出其中英文字母、空格、数字和特殊符号的个数。
【注意!!这道题需要把字符转换为ASCII码!!!】
n = input('请输入字符串:')
a= 0
b= 0
c= 0
d= 0
if n.isalpha():
print('英文字母的个数为',len(n))
elif n.isspace():
print('空格的个数为',len(n))
elif n.isdigit():
print('数字的个数为',len(n))
else:
for i in n:
if ord(i) in range(65,91) or ord(i) in range(97,123):
a += 1
elif i is ' ':
b += 1
elif ord(i) in range(48,58):
c += 1
else:
d += 1
print('英文字母的个数为:',a, '空格的个数为:',b, '数字的个数为:',c, '特殊字符的个数为:',d)