目录
Python之第六章 内置容器 --- 字符串
1.概念
2.凭借字符串 --- +
3.多行字符串
4.字符串的切片
例 输入员工省份证号,输出出生日期
5.分隔合并字符串
分隔字符串
合并字符串
6.字符串的查找
count( ) 方法
find( ) 方法
startswitch( ) 方法
endswitch( ) 方法
7.字母大小写转换
大写 - > 小写:strname.lower( )
小写 - > 大写:strname.upper( )
8.判断是否为字母
例 判断字符串中字母出现的次数
9.字符串的删除
strname. strip(char) 方法 --- 删除字符串左右指定字符
strname.lstrip(char) --- 删除祖父穿左侧指定字符
strname.rstrip(char) --- 删除字符串右侧指定字符
例1 统计字符串中单词个数
strname.replace( ' 需要替换字符串 ', ' 替换结果 ')
10.字符串文本对齐
居中 --- center
左对齐 --- ljust
右对齐 --- rjust
11.程序案例
例1 编写程序,检测输入的字符串密码是否是一个合法的密码,规则如下:密码必须至少八个字符,只能包含英文和数字,密码至少包含2个数字
例2 编写程序,实现输入一个二进制数转换为十进制数,如:1001 十进制 9,1 * 2^0+0 * 2^1+0 * 2^2+1 * 2 ^3
例3 国际标准书号共10位:d1d2d3d4d5d6d7d8d9d10,最后一位d10是效验为,效验计算公式(d1 * 1+d2 * 2+d3 * 3+d4 * 4+d5 * 5+d6 * 6+d7 * 7+d8 * 8+d9 * 9)%11,若计算结果为10则使用x表示,编写程序,输入前9个内容,输出标准书号。
例4 统计字符串汇总字母个数,存储到列表b[26],a的个数存储在b[0],b的个数存储在b[1],z的个数存储在b[25]
例5 将字符串中大写字母改写为下一个字母,Z字母改为A
例6 将2个字符串逆置后交叉合并到新字符串中,如:str1= ‘abcdef ’,str2 = ‘12345678’,str3 = f8e7d6c5b4a321
例7 字符串排序,Python中字符串类不允许直接修改元素,需要将其转换为列表之后进行排序,排完后转回字符串
例8 排除字符串首尾个元素,剩余内容排序
12.格式化字符串
例
13.通过format()方法来实现
14.字符串编码
Unicode和UTF-8的关系
UTF的分类
15.Python中的字符串的两种类型
使用encode()方法编码
使用decode()方法解码
字符串 --- 由 ' ' 或 " " 包裹起来的任意不可变序列文本序列
str1 = 'china' # 字符串
print(str1[0]) # 字符串常量不可变,但支持列表索引的操作
str2 = ['china', 'hello', 'nihao '] # 二维字符串 或 字符串列表
str2[0] = 'CHINA'
print(str2)
结果:
c
['CHINA', 'hello', 'nihao ']
单双引号使用
print('几多.范罗苏姆外号“龟叔”')
结果:
几多.范罗苏姆外号“龟叔”
str1 = "我今晚跑步数为:"
num = 3200
print(str1+num) # 报错 ,字符串的拼接只能是字符串
print(str1+str(num))
结果:
我今晚跑步数为:3200
注意:
字符串的拼接只能是字符串,其他类型会发生报错。
字符串长度多余一行时,可以使用三引号将字符串包夹
str1 = '''china
china china
china china china '''
print(str1)
结果:
china
china china
china china china
原则 --- 字符串属于不可变序列,可以通过切片来实现字符串的截取
格式 --- strname[ start, end, step]
start --- 从0索引开始
end --- 最后一个字符的索引
step --- 切片长度,默认为1
str1 = '2022,加油,中国'
print(str1)
print(str1[0])
print(str1[0:])
print(str1[5:])
print(str1[:3])
print(str1[2:6])
print(str1[1:10:2])
print(str1[-1:-3:-1])
结果:
2022,加油,中国
2
2022,加油,中国
加油,中国
202
22,加
02加,国
国中
# 例1 输入员工省份证号,输出出生日期
str1 = input('请输入员工的身份证号:')
if len(str1) == 18:print("该员工出生日期为:", str1[6:10], "年", str1[10:12], "月", str1[12:14], "日")if int(str1[-2]) % 2 == 0:print("该员工为:女性")else:print('该员工为:男性')
else:print("您输入的身份证号错误")
结果:
请输入员工的省份证号:610628199908270330
该员工出生日期为: 1999 年 08 月 27 日
该员工为:男性
分隔 --- 将字符串分隔为列表
格式 --- strname.split( sep,maxsplit )
sep --- 指定分隔符,可以包含多种符号(空格, \n, \t 等),默认为None
maxsplit --- 指定分隔次数
str1 = 'python 软件官网 >>> https://www.python.org.'
print("原串码:", str1)
list1 = str1.split() # 省略分隔符sep
list2 = str1.split('>>>')
list3 = str1.split('.')
list4 = str1.split(" ", 3)
print(list1)
print(list2)
print(list3)
print(list4)
结果:
原串码: python 软件官网 >>> https://www.python.org.
['python', '软件官网', '>>>', 'https://www.python.org.']
['python 软件官网 ', ' https://www.python.org.']
['python 软件官网 >>> https://www', 'python', 'org', '']
['python', '软件官网', '>>>', 'https://www.python.org.']
合并 --- 将多个字符串采用固定的分隔符进行连接
格式 --- strnew = string.join(iterable)
strnew --- 新字符串名称
string --- 合并时的分隔符
jion --- 方法
iterable --- 被合并的字符串 --- 迭代对象
作用 --- 检索字符串在另一串中出现的次数,若不存在返回 0
格式 --- strname.count(substring)
substring --- 要检索的字符串
str1 = '***ABV***def***'
cn1 = str1.count("*")
cn2 = str1.count("?")
print("*号次数:", cn1, "?号次数", cn2)
结果:
*号次数: 9 ?号次数 0
str1 = '***********'
cn1 = str1.count('*')
cn2 = str1.count('**')
print("次数:", cn1, cn2)
结果:
次数: 11 5
作用 --- 检索是否包含指定字符串,若不存在则返回 -1 ,否则返回首次出现的索引值
格式 --- strname.find( sub )
sub --- 子串内容
str1 = input("输入主串:")
str2 = input("输入子串:")
# 方法一
num = str1.find(str2)
if num > -1:print("存在,第一次出现的索引为:", num, "内容为:", str1[num])
else:print('不存在')
# 方法二
print(str2 in str1)结果:
输入主串:123123123
输入子串:5
不存在
None
输入主串:1235456123
输入子串:5
存在,第一次出现的索引为: 3 内容为: 5
True
注意:
find( )一般用于在主串总查找子串是否存在,还可以使用 in 实现
作用 --- 检索字符串是否以指定字符串开头
作用 --- 检索字符串是否以指定字符串结尾
str1 = input()
print(str1.lower())
print(str1.upper())
结果:
awdanga414515ADFJWIFOAF
awdanga414515adfjwifoaf
AWDANGA414515ADFJWIFOAF
注意:
这两种内置方法只能实现单一转换不能互换
大小写互换 - > strn.swapcase( )
str1 = input()
print(str1.swapcase())
结果:
asdahSDAHDKAdahsda
ASDAHsdahdkaDAHSDA
格式 --- strname.isalpha( ) --- 成立返回Ture,不成立返回False
str1 = input("请输入字符串:")
cnt = {} # 定义一个空字典
for i in str1:if i.isalpha() == True:cnt[i] = cnt.get(i, 0) + 1 # cnt.get(i, 0) 计算i(键)对应的值,找不到返回 0
print(cnt)
结果:
请输入字符串:dasda1e648qwf4g86
{'d': 2, 'a': 2, 's': 1, 'e': 1, 'q': 1, 'w': 1, 'f': 1, 'g': 1}
没写char,则默认删除对应位置空白字符( \t \n \r 空格)
# 例1 统计字符串中单词个数
str1 = input('请输入一串字符:')
str1 = str1.strip() # 删除左右空白字符(空格)
# 方法:判断当前字符不是空格,下一个字符是空格
cnt = 1
i = 0
while i < len(str1) - 1:if str1[i] != ' ' and str1[i + 1] == ' ':cnt += 1i = i + 1
if str1 == '':cnt = 0
print('单词个数为:', cnt)
结果:
请输入一串字符:aa dwh fqif fqf fwqf hieg fqw
单词个数为: 7
str1 = '***dasd***dgrh***'
str1 = str1.replace('*', '0')
print(str1)
结果:
000dasd000dgrh000
poem = '浮舍', '魈', '疾风之下', '亦有归途', '我于花露之中绽放', "亦如黎明中的花朵"
for i in poem:print('|%s|' % i)
# 删除左右空白
# 居中
for i in poem:print('|%s|' % i.strip().center(10))结果:
|浮舍|
|魈|
|疾风之下|
|亦有归途|
|我于花露之中绽放|
|亦如黎明中的花朵|
| 浮舍 |
| 魈 |
| 疾风之下 |
| 亦有归途 |
| 我于花露之中绽放 |
| 亦如黎明中的花朵 |
# 例1 编写程序,检测输入的字符串密码是否是一个合法的密码,规则如下:密码必须至少八个字符,只能包含英文和数字,密码至少包含2个数字
str1 = input("请输入密码:")
t = 0
for i in str1:if i.isdigit(): # 计算字符串中数字个数t += 1
if len(str1) >= 8:if str1.isalnum(): # 判断字符串是否只包含字母和数字if t >= 2:print("密码正确")else:print("密码错误,包含数字少于2个")else:print("密码错误,只能包含字母和数字")
else:print("密码长度至少为8")
结果:
请输入密码:da6d5f5!
密码错误,只能包含字母和数字
请输入密码:123
密码长度至少为8
请输入密码:161651981
密码正确
请输入密码:adasgegewr
密码错误,包含数字少于2个
# 例2 编写程序,实现输入一个二进制数转换为十进制数,如:1001 十进制 9,1 * 2^0+0 * 2^1+0 * 2^2+1 * 2 ^3
str1 = input('请输入二进制数:')
d1 = 0 # 接收转换结果
t = 0 # 权值
f = 1
if str1.isnumeric(): # 判断字符串至少有一个字符且所有字符均为数字str2 = str1[::-1] # 将字符串逆置, str2接收逆置的结果for i in str2:if i == '1' or i == '0':d1 = d1 + int(i) * 2 ** telse:print('无效数字')f = 0breakt = t + 1 # 权值+1if f == 1:print(str1, '转为是十进制整数是:', d1)else:print('无效数字')
else:print('输入格式错误')结果:
请输入二进制数:1001
1001 转为是十进制整数是: 9
请输入二进制数:asdag
输入格式错误
请输入二进制数:1984
无效数字
# 例3 国际标准书号共10位:d1d2d3d4d5d6d7d8d9d10,最后一位d10是效验为,效验计算公式(d1 * 1+d2 * 2+d3 * 3+d4 * 4+d5 * 5+d6 * 6+d7 * 7+d8 * 8+d9 * 9)%11,若计算结果为10则使用x表示,编写程序,输入前9个内容,输出标准书号。
str1 = input('请输入国际标准书号前9位:')
check = 0
t = 1
for i in str1:check = check + int(i) * tt += 1
check %= 11
if check == 10:check = 'x'
print(str1 + str(check))
结果:
请输入国际标准书号前9位:123456789
123456789x
#例4 统计字符串汇总字母个数,存储到列表b[26],a的个数存储在b[0],b的个数存储在b[1],z的个数存储在b[25]
# 方法一
例4 统计字符串汇总字母个数,存储到列表b[26],a的个数存储在b[0],b的个数存储在b[1],z的个数存储在b[25]str1 = input('请输入英文字符串')
b = [0] * 26 # b 列表全部清零
str1 = str1.lower() # lower()大写转小写
for i in str1:if i.isalpha(): # isalpha()判断是否为字母b[ord(i) - 97] += 1 # ord()提取当前字母的ASCII值,当前字母ASCII值减去首字母的ASCII值
print(b)
# 方法二
str1 = input('请输入英文字符串')
b = []
str1 = str1.lower()
for i in range(26):b.append(str1.count(chr(97+i))) #chr() 转换为字符串
print(b)
结果:
请输入英文字符串dasdaggtj
[2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0]
# 例5 将字符串中大写字母改写为下一个字母,Z字母改为A
str1 = input('请输入大写英文字符串')
for i in str1:if i >= 'A' and i <= "Y":i = chr(ord(i) + 1) # 转换为ACSII值+1后转换为字符串类型elif i == 'Z':i = 'A'print(i, end='')结果:
请输入大写英文字符串asdhfwuADWHADIFHAF
asdhfwuBEXIBEJGIBG
上例改为:将大写字母改为上一个,A改为Z
#上例改为:将大写字母改为上一个,A改为Z str1 = input('请输入大写英文字符串') for i in str1:if i >= 'B' and i <= "Z":i = chr(ord(i) - 1) # 转换为ACSII值+1后转换为字符串类型elif i == 'A':i = 'Z'print(i, end='')结果: 请输入大写英文字符串dsadABCD dsadZABC
# 例6 将2个字符串逆置后交叉合并到新字符串中,如:str1= ‘abcdef ’str2 = ‘12345678’,str3 = f8e7d6c5b4a321
str1 = input('请输入一个字符串:')
str2 = input('请输入另一个字符串:')
print(str1, str2, sep='\n')
str1 = str1[::-1] # 字符串切片逆序
str2 = str2[::-1]
str3 = ''
i = 0
j = 0
while i < len(str1) or j < len(str2):if i < len(str1):str3 += str1[i] # 拼接if j < len(str2):str3 += str2[j]i += 1j += 1
print(str3)
结果:
请输入一个字符串:123456
请输入另一个字符串:abcd
123456
abcd
6d5c4b3a21
# 例7 字符串排序,Python中字符串类不允许直接修改元素,需要将其转换为列表之后进行排序,排完后转回字符串
str1 = '987654321'
list1 = list(str1)
list1.sort()
str1 = ''.join(list1)
print(str1)
结果:
123456789
# 例8 排除字符串首尾个元素,剩余内容排序
str1 = input('请输入一个字符串:')
str2 = str1[1:-1] #或者str1[1:len(str1)-1]
list1 = list(str2)
list1.sort()
str2 = ''.join(list1)
print(str1[0] + str2 + str1[-1])
结果:
请输入一个字符串:dcab
dacb
定义 --- 改格式化字符串是指指定一个模板,该模板留出一些空位,在根据需要天上相应的内容
实现 --- 通过操作符 % 实现 --- %[ - ] [ + ] [ 0 ] [ .n ] % exp
参数说明
--- [ ]表示内容可选
--- - 左对齐
--- + 右对齐
--- 0 右对齐,用0填充空白,一般配合参数m使用
--- m 宽度
--- n 小数保留位数
格式化字符 | 作用 | 格式化字符 | 作用 |
---|---|---|---|
%s | 字符串 | %r | 字符串 |
%c | 单个字符 | %o | 八进制 |
%d or %i | 十进制整数 | %e | 指数 |
%x | 十六进制整数 | %E | 指数 |
%f or %F | 浮点数 | %% | 字符串% |
str1 = '编号:%05d\t公司名称:%s官网:https://www.%s.com.'
str2 = (1, '百度', 'baidu')
str3 = (2, '腾讯', 'qq')
str4 = (3, '字节跳动', 'bytedance')
print(str1 % str2)
print(str1 % str3)
print(str1 % str4)
结果:
编号:00001 公司名称:百度官网:https://www.baidu.com.
编号:00002 公司名称:腾讯官网:https://www.qq.com.
编号:00003 公司名称:字节跳动官网:https://www.bytedance.com.
Python2.6版本以后推荐使用format( )方法
格式 --- str.format (args)
str --- 字符串显示的样式即模板
args --- 需要转换的对象,若有多项可以使用逗号分隔
占位符 --- { } 和 :
模板格式 --- { index: fill aglin sign # width.percision type}
index --- 索引位置,默认为0开始,省略自动分配
fill --- 空白填充的字符
aglin --- 对齐方式,一般与 width(宽度)配合使用
< --- 左对齐
> --- 右对齐
= --- 内容右对齐,支队数字类型有效,即数字放在填充字符的最右侧
^ --- 内容居中
sign --- 指定有无符号
加号 ---正数
减号 --- 负数
空格 --- 正数加正号,负数加负号
# --- 值为二、八、十六进制时,显示0b、0o、0x的前缀
width --- 宽度
percision --- 保留的小数位数
type --- 类型
ASCII码 --- 对10个数字、52个英文大小写字母、其他字符进行编号最多表示256个字符,每个字符占1B
GBK\GBK2312 --- 中文汉字编码,1B表示英文字母,2B表示汉字
Unicode --- 称为万国码、统一码,用于满足跨语言、跨平台的文件转换处理要求
Unicode --- 包含全球所有国家的字符编码的映射关系,已达到编码的统一使用
Unicode --- 表示字符太浪费空间,为了解决字符的存储和传输问题而产生了UTF编码
UTF --- Unicode Transformation Format --- 只用于存储和传输的时候使用,便于存储和传输时节空间和时间
UTF-8 --- 使用1、2、3、4个字节表示字符,优先使用1B来表示字符,无法满足时增加1B,最多4B,英文占1B,欧洲语系2B,东亚语系3B,其他特殊字符占4B
UTF-16 --- 使用2、4字节表示字符
UTF-32 --- 直接使用4字节
总结 --- UTF 编码是为了UNICODE编码设计的一种存储和传输时节省空间的编码方案
str --- 在内存中使用了Unicode表示字符串
bytes --- 字节类型,网络传输或存储磁盘时使用二进制表示,以b开头
b'\xs2\xb0'
作用 --- 将字符串str 转为二进制(bytes)压缩成 bytes类型
格式 --- strname.encide(encoding = ' 编码格式 ')
编码格式 --- 可以省略,默认为UTF-8 ,也可以省略encoding =
str1 = '书山有路清胃经'
by1 = str1.encode('GBK')
by2 = str1.encode()
print('原字符串:%s' % str1, '转为GBK:%s' % by1, "转为UTF-8:%s" % by2, sep='\n')
结果:
原字符串:书山有路清胃经
转为GBK:b'\xca\xe9\xc9\xbd\xd3\xd0\xc2\xb7\xc7\xe5\xce\xb8\xbe\xad'
转为UTF-8:b'\xe4\xb9\xa6\xe5\xb1\xb1\xe6\x9c\x89\xe8\xb7\xaf\xe6\xb8\x85\xe8\x83\x83\xe7\xbb\x8f'
作用 --- 将bytes类型二进制数据转换为字符串
格式 --- bytes.decode( endcoding = ' UTF-8 ')
str1 = '书山有路清胃经'
by1 = str1.encode('GBK')
by2 = by1.decode('GBk')
print('原字符串:%s' % str1, '转为GBK:%s' % by1, "解码%s" % by2, sep='\n')
str1 = '书山有路清胃经'
by1 = str1.encode('GBK')
by2 = by1.decode('GBk')
print('原字符串:%s' % str1, '转为GBK:%s' % by1, "解码%s" % by2, sep='\n')
结果:
原字符串:书山有路清胃经
转为GBK:b'\xca\xe9\xc9\xbd\xd3\xd0\xc2\xb7\xc7\xe5\xce\xb8\xbe\xad'
解码书山有路清胃经
下一篇:Java类和对象(一)