一、字符串基础
1.什么是字符串(str)
格式:元素1元素2元素3...
字符串是容器型数据类型,将 单引号 作为容器的标志,元素不需要用逗号隔开
字符串是 不可变的(不支持增删改) ,字符串是 有序的(支持下标操作)
字符串的元素:只能是 本文符号(所有在计算机能够表达出来的符号都是文本符号)
字符串中每一个独立的元素又叫:字符;在python中只有字符的概念,但没有字符对应的数据类型
空串
str1 = ''
str2 = ""
str3 = ''''''
str4 = """"""
非空字符串
str11 = 'abc'
str22 = "你好"
2.字符(字符串中的元素)
字符串中的字符分两种:普通字符、转义字符
1)普通字符
除了转义字符以外的字符
2)转义字符
在指定符号前加‘\’用来表示一些特殊功能和特殊意义的字符
\n - 换行
\t - 制表符(tab键)
' - 单引号
" - 双引号
\ \ - 反斜杠
编码字符
\u + 4位的十六进制
str5 = '\uaa3c\u2342\u4e00'
print(str5,len(str5)) # ⍂一 3
3)阻止转义
在字符串的最开始的引号前面加R / r,那么字符串中的所有的转义字符都有效
str6 = r'\tabc\n234\u4e00'
print(str6) # \tabc\n234\u4e00
应用:windows路径,正则表达式语法
二、字符串编码
1.什么是字符编码
计算机在存储数据的时候只能存数字,而且存的是 数字的补码
为了能够让计算机存储文本数据,给每个字符关联了一个固定的数字,用来对这个字符进行存储
每个字符关联的那个数字就是这个字符的 编码值。
2.编码表
1)ASCII码表
用一个字节来保存字符的编码值(0 ~ 127)
2)Unicode编码表
Unicode编码表是对ASCII表的扩展(Unicode编码表中包含了ASCII表中所有的符号)
Unicode编码表中包含了世界上所有国家所有民族所有的语言的符号,总共65536个
中文范围:0x4e00 - 0x9fa5
1)chr函数
chr(编码值) - 获取指定编码值对应的字符
print(chr(0x0f00)) # ༀ
# 获取所有的中文字符
for x in range(0x4e00,0x9fa5):
print(chr(x),end=',')
2)ord函数
ord(字符) - 获取指定字符对应的编码值
print(ord('杨')) # 26472
三、字符串相关操作
1.获取字符串中的元素(获取字符)
字符串获取元素和列表获取元素的语法一样
str1 = 'how are you'
1)获取单个元素
print(str1[1],str1[-1]) # o u
2)切片
print(str1[1:5]) # ow a
print(str1[-3::-1]) # y era woh
3)遍历
for x in str1:
print(x)
2. +, *
字符串1 + 字符串2
字符串 * N 或者 N * 字符串
str1 = 'abc'
str2 = '123'
print(str1 + str2) # abc123
print(str1 * 2) # abcabc
3.==,!=
print(str1 == str2) # False
4.>, <, >=, <= (针对两个字符串)
两个字符串比较大小:比较的是第一组不相等的字符的编码值的大小
str3 = 'ABC'
str4 = 'abcd'
print(str3 < str4) # True
应用:
判断是否是数字字符:'0' <= char <= '9'
判断是否是小写字母:'a' <= char <= 'z'
判断是否是大写字母:'A' <= char <= 'Z'
判断是否是字母:'a' <= char <= 'z' or 'A' <= char <= 'Z'
练习1:输入一个字符串,统计字符串字母和中文的个数
str5 = 'hello,你好吗?'
cou = 0
count = 0
for x in str5:
if 'a' <= x <= 'z' or 'A' <= x <= 'Z':
cou += 1
elif 0x4e00 <= ord(x) <= 0x9fa5:
count += 1
print(cou,count)
练习2:判断输入的字符是否是纯数字字符串
str6 = '234wer'
for x in str6:
if '0' <= x <= '9':
continue
else:
print('不是纯字符串')
break
else:
print('纯字符串')
5.in 和 not in
字符串1 in 字符串2 - 判断字符串1是否是字符串2的子串
print('abc' in 'abcmn') # True
6.相关函数
max / min / sorted / reversed等,这些函数都适用于字符串
len - 求字符串长度
str - 将自定数据转换成字符串类型
a.所有的数据都能转换成字符串
b.将数据的打印值作为字符串的内容
四、字符串相关方法
1.center/rjust/ljust/zfill
字符串.center(长度,填充字符)
产生一个新的字符串,长度是指定长度,原字符串在新字符串中间,左右用指定字符串填充
字符串.rjust(长度,填充字符)
产生一个新的字符串,长度是指定长度,原字符串在新字符串最右边,左边用指定字符串填充
字符串.zfill(长度) == 字符串.rjust(长度,'0')
字符串.ljust(长度,填充字符)
产生一个新的字符串,长度是指定长度,原字符串在新字符串最左边,右边用指定字符串填充
str1 = 'abc'
new_str = str1.center(7,'0')
print(new_str) # 00abc00
new_str = str1.rjust(7,'*')
print(new_str) # ****abc
练习:给任意一个商品的数字编号值,转换成固定格式的商品编码:GDXXXX -> GD0001
num = 34
print('GD' + str(num).zfill(4)) # GD0034
2.replace
字符串1.replace(字符串2,字符串3) - 将字符串1中所有的字符串2替换成字符串3
字符串1.replace(字符串2,字符串3, N) - 将字符串1中前N个字符串2替换成字符串3
str1 = 'lksdjflksdjdoifwjo'
new_str = str1.replace('ksd', 'abc')
print(new_str) # labcjflabcjdoifwjo
print(str1.replace('ksd', 'abc', 1)) # labcjflksdjdoifwjo
3.计算次数
字符串1.count(字符串2) - 统计字符串1中字符串2出现的次数
字符串1.count(字符串2,开始下标 = 0,结束下标 = 字符串长度)- 在字符串1中指定范围内统计字符串2出现的次数
4.切割字符串
字符串1.split(字符串2) - 将字符串1按照字符串2为切割点进行切割
字符串1.split(字符串2,N) - 将字符串1按照字符串2为切割点进行切割,切N次
字符串1.rsplit(字符串2,N) - 将字符串1按照字符串2为切割点进行切割,切N次,从后往前切
str1 = 'how are you? i am fine, and you'
print(str1.split(' ')) # ['how', 'are', 'you?', 'i', 'am', 'fine,', 'and', 'you']
print(str1.split(' ', 2)) # ['how', 'are', 'you? i am fine, and you']
print(str1.rsplit(' ', 2)) # ['how are you? i am fine,', 'and', 'you']
5.修改大小写
字符串1.capitalize()
字符串1.title()
字符串1.lower()
字符串1.upper()
6.删除字符
此方法不能删除中间的空白
字符串1.strip() - 同时删除字符串中最左边和最右边的所有空白(包括换行,缩进,空格)
字符串1.lstrip() - 删除字符串中最左边的所有空白(包括换行,缩进,空格)
字符串1.rstrip() - 删除字符串中最右边的所有空白(包括换行,缩进,空格)
字符串1.strip(字符串2) - 同时删除字符串中最左边和最右边的所有字符串2
字符串1.lstrip(字符串2) - 删除字符串中最左边的所有字符串2
字符串1.rstrip(字符串2) - 删除字符串中最右边的所有字符串2
7.查找字符串内容
字符串1.find(字符串2) - 获取字符串2第一次在字符串1中出现的位置(用正的下标值表示,如果找不到返回-1)
字符串1.find(字符串2,开始下标,结束下标) - 获取字符串2在字符串1中开始下标到结束下标内第一次在字符串1中出现的位置
str1 = 'how are you? Im fine, Thank you! And you'
for i in range(0, len(str1)):
if str1[i: i + len('you')] == 'you':
print(str1.find('you', i, len(str1)))
8.拼接
字符串.join(容器) - 将容器中元素用指定字符串连接在一起,容器中的元素要求是字符串
list1 = ['小明','小红','小黑']
new_str = ' and '.join(list1)
print(new_str)
new_str2 = '+'.join('abc')
print(new_str2)
# 练习2:将任意容器中的元素使用join进行连接
nums = [10, 20, 30]
nums1 = {'name':'小明','age':18,'sex':'男'}
new_str3 = ''.join(str(x) for x in nums)
new_str4 = ','.join(str(x) for x in nums1)
new_str5 = ','.join(str(x) for x in nums1.values())
print(new_str3)
print(new_str4)
print(new_str5)
注意 :以上方法为常用方法,其他更多的方法详见菜鸟教程~
五、格式字符串
字符串中某一个或者多个部分不确定就可以用格式字符串来实现功能
正常写法
name = '张三'
age = 23
message = name + '今年'+ str(age) +'岁!'
print(message) # wer今年32岁!
1.格式占位符
语法:
包含格式占位符的字符串 % (数据1,数据2,数据3,...)
说明:
a.数据的个数和前面占位符的个数保持一致
b.格式占位符:
%d - 整数;
%Nd - 整数填充字符串的时候宽度是N,不够用空格在前面/后面占位;
%f - 小数;
%.Nf - .N表示保留N位小数
%s - 字符串
注意:一般情况下占位符和数据类型需要保持一致,只有%s可以用任何类型的数填充
message = '%s今年%-5d岁!' % (name, age)
print(message) # wer今年32 岁!
2.format
在字符串中通过{}来占位表示字符串中变化的部分
1)数据的个数和{}的个数保持一致
message = '{}今年{}岁!'.format(name,age)
print(message) # wer今年32岁!
2)列表形式的format:{下标}
# ‘你好我是XXX。XXX你好’
message = '你好我是{0}。{0}你好'.format(name)
print(message) # 张三今年18岁,分数89
3)key形式的format:{key}
str3 = '{name}今年{age}岁,分数{score}'.format(name='张三',age=18,score=89)
print(str3) # 张三今年18岁,分数89
4)key形式format的变形:
f'字符串{变量名}'
a = 10
b = 20
message = f'a={a},b={b}'
print(message) # a=10,b=20
5)数字格式化
:.Nf - 限制小数的小数点位数(N位)
:x>Nf - 数字占N位,不够用X填充
:, - 用逗号将数据进行分割(通用于银行数据显示)
:.N% - 用百分比的数据显示数据,数据保留N位小数
print('数字:{:.2f}'.format(3.1415926)) # 数字:3.14
print('数字:{1:.2f}'.format(3.1415926,1.12334)) # 数字:1.12
print('数字:{n1:.2f}'.format(n1=3.1415926,n2=1.12334)) # 数字:3.14
print('{:0>5d}'.format(34)) # 00034
print(f'{34:a<5d}') # 34aaa
print(f'{34: >5d}') # 34
num = 120230203000023000
print(f'{num:,}')
num = 0.45
print(f'{num:.2%}')