字符串和字符
字符串定义
- 容器型数据类型;
- 将**’ ‘、" "、’’’ ‘’’、""" “”“作为容器标志(’’’ ‘’’、”"" “”"**换行可以不使用转义字符,可直接用回车);
- 引号中的每个符号就是该字符串的元素;
- 字符串不可变(不支持增删改);字符串有序(支持下标操作);
- 元素:引号中的单独的每个符号都是字符串的元素(又叫字符),可以是任何符号;
str1 = '900,100'
str2 = '''
abc
123
'''
print(str2)
空串
str8 = '' # "" """"""
print(str8, type(str8), len(str8)) # <class 'str'> 0
字符
普通字符
- 表示符号本身意义
转义字符
- 具有特殊功能的字符组合;
- 在特定符号前加****让符号具备特殊的功能;
- 任意一个转义字符的长度为1;
常用转义字符
- \n - 换行
- **\t ** - 水平制表符(相当于tab键的功能)
- \’ - 表示普通的单引号
- \" - 表示普通的双引号
- \\ - 表示一个普通的反斜杠
- \u - 4位的十六进制数(编码字符)
str3 = '\tabc\n123'
print(str3)
str4 = 'it`s me\'hahahah\'' # 使用转义字符展示单引号
str5 = "it`s me'hahahah'" # 外层用双引号消除歧义
print(str4, str5)
str6 = 'abc\\name'
str7 = 'abc\name'
print(str6, str7)
# \u
str9 = 'abc\u5fdf'
print(str9) # abc忟
r/R语法
- 在字符串前面加r,那么字符串中所有的转义字符的功能都会消失;
str_r = 'abc123'
str_r1 = r'\'ttl\''
print(str_r, str_r1, str_r + str_r1) # abc123 \'ttl\' abc123\'ttl\'
字符编码
编码
- 计算机之呢过直接存储数字(而且保存的数字的二进制的补码),文字符号是无法直接存储到计算机中的。
- 为了让计算机具备存储文字符号能力,给所有的文字符号对应一个固定的数字,每次存储符号对应的数字,符号对应的数字就是编码值。
编码表
ASCII码表
- 总共有128个字符(美国符号)
- 数字与字母位置
- 数字在字母前面
- 大小字母在小写字母前面
- 大写字母与小写字母并不连续,中间有其他符号;
- 数字字符:0~9 - 十进制|48~57
- 大写字母字符:A~Z - 十进制|65~90
- 小写字母字符:a~z - 十进制|97~122
Unicode编码表
- 对ASCII编码表的扩展,包含了世界上所有的语言符号(又称:万国码),总共65536个
- 中文范围:4e00 ~ 9fa5(16进制)
编码值在Python中的使用
- chr 函数:chr(编码值) - 获取编码值对应的字符
- ord 函数:ord(字符) - 获取字符的编码值
- 编码字符:\u+4位编码值 - 表示这个编码值对应的字符
- 注意:python中需要字符的地方都必须使用长度为1的字符串赋值
chr
print(chr(97)) # a
print(chr(35), chr(0x23)) # (# #)
print(chr(0x4e00), chr(0x9fa5)) # 一 龥
-
练习1:打印中文字符
num = 0 for x in range(0x4e00, 0x9fa5+1): print(chr(x), end=' ') num += 1 if num % 30 == 0: print()
-
练习2:打印八卦阵图符号
num = 0 for x in range(0x4dc0, 0x4dff + 1): print(chr(x), end=' ') num += 1 if num % 30 == 0: print()
ord
print(ord('傻'), ord('逼')) # 20667 36924
# 练习:将大写字母转换成对应的小写字母
c = 'M'
print(chr(ord(c) + 32)) # m
字符串相关操作
查 - 获取字符串的字符
-
字符串获取字符的语法和列表获取元素的语法一模一样
-
如果字符串有转义字符需注意转义字符整体长度为1
str1 = '\tabc\n123\'+_'
print(str1[1], str1[-1])
print(str1[5:8], str1[5:-3])
print(str1[::-1])
数学运算符:+、*
print('hello' + 'world!') # helloworld!
print('hello' * 2) # hellohello
-
练习
- 提取字符中小写字母
str2 = 'ss试试看78,mvn0-k=上课23' new_str2 = '' for x in str2: if 97 <= ord(x) <= 122: new_str2 += x print(new_str2) # ssmvnk print(''.join([x for x in str2 if 97 <= ord(x) <= 122])) # ssmvnk
比较运算符
比较是否相等:==、!=
print('abc' == 'abc') # True
print('abc' == 'acb') # False
比较大小:>、<、>=、<=
-
判断是否是数字字符:‘0’ <= char <= '9’
-
判断是否是小写字母:‘a’ <= char <= 'z’
-
判断是否是大写字母:‘A’ <= char <= 'Z’
-
判断是否是字母:‘A’ <= char <= ‘Z’ or ‘a’ <= char <= 'z’
-
判断是否是中文:’\u4e00’ <= char <= '\u9fa5’
-
两个字符串比较大小,比较的是第一对不相等的字符的编码值的大小
print('Mnxy' > 'ab') # False
print('你好吗' > 'hello') # True
print('123' > 'KM123') # False
-
练习
-
统计中文字符个数
-
打印字符串中所有的数字字符
-
提取字符串中所有的字母
str3 = '你好loe--23=sks;M9JHkyu是-12山卡拉' cn_count = 0 num_1 = '' alphabet = '' for x in str3: if '\u4e00' <= x <= '\u9fa5': cn_count += 1 elif 'A' <= x <= 'Z' or 'a' <= x <= 'z': alphabet += x elif '0' <= x <= '9': num_1 += x print(cn_count, num_1, alphabet)
-
in 和 not in
- 判断字符串2中是否包含字符串1(判断字符串1是否是字符串2的子串)
print('1' in 'abc123') # True
print('abc' in 'abc123') # True
print(10 in [10, 20, 30]) # True
print([10, 20] in [10, 20, 30]) # False
print('ac' in 'abc123') # False
相关函数
len(字符串)
str(数据)
- 将数据转换成字符串(任何类型的数据都可以转换成字符串)
- 转换的时候在数据的打印值外面加引号
eval(字符串)
- 相当于str反向操作,返回传入字符串的表达式的结果
str(100) # '100'
str(13.9) # '13.9'
str([10, 20, 30]) # '[10, 20, 30]'
print(len(str([10, 20, 30]))) # 12 注意打印标准写法后符号后有空格,也算字符;
str(lambda x: x * 2) # '<function <lambda> at 0x0000000002558F70>'
print(eval('100')) # 100
print(eval('[10,20,30]')) # [10, 20, 30]
result1 = eval('10')
print(result1, type(result1)) # 10 <class 'int'>
result2 = eval('[10,20,30]')
print(result2, type(result2)) # [10, 20, 30] <class 'list'>
result3 = eval('10 + 20')
print(result3, type(result3)) # 30 <class 'int'>
abc = 200
print(eval('abc')) # 200
a = b = 10
print(eval('a + b')) # 20
字符串相关方法
join
-
字符串.join(序列)
-
将序列中的元素使用指定的字符拼接成一个字符串(序列中的元素必须是字符串);
list1 = ['abc', 'def', '999'] result = ''.join(list1) print(result) # abcdef999 result1 = '+'.join(list1) print(result1) # abc+def+999 result2 = '123'.join('abc') print(result2) # a123b123c # 练习1:将list2中所有元素拼接成一个字符串 list2 = ['abc', 100, True, 'hello'] result3 = ''.join([str(x) for x in list2]) print(result3) # abc100Truehello # 练习2:将list2中所有的字符串拼接成一个字符串 list2 = ['abc', 100, True, 'hello'] print(''.join([x for x in list2 if type(x) == str])) # abchello
count
-
字符串1.count(字符串2)
-
统计字符串1中字符串2出现的次数;
message = 'how are you? i am fine! thank you! and you?' result4 = message.count('you') print(result4) # 3
index/find
-
字符串1.index(字符串2)
- 获取字符串2第一次出现在字符串1中的位置(下标值),字符串2不存在时报错
-
字符串1.find(字符串2)
- 获取字符串2第一次出现在字符串1中的位置(下标值),字符串2不存在时返回-1
-
rindex/rfind
- 从右往左查找,找到最后一个匹配字符串返回下标值
result5 = message.index('you')
print(result5) # 8
result6 = message.find('youm')
print(result6) # -1
result7 = message.rindex('you')
print(result7) # 39
split
-
字符串1.split(字符串2)
- 将字符串1中所有的字符串2作为切割点对字符串1进行切割
-
字符串1.split(字符串2,N)
- 将字符串1中所有的字符串2作为切割点对字符串1进行切割,最多切N次
-
注意:无论怎么分布,切割后的段数都是切割点的数量加1
message = 'mnabc123abcxyzabcoop'
result8 = message.split('abc')
print(result8) # ['mn', '123', 'xyz', 'oop']
message = 'abcmnabc123abcxyzabcoopabc'
result9 = message.split('abc')
print(result9, len(result9)) # ['', 'mn', '123', 'xyz', 'oop', ''] 6
message = 'mnabc123abcxyzabcoop'
result10 = message.split('abc', 1)
print(result10) # ['mn', '123abcxyzabcoop']
replace
-
字符串1.replace(字符串2,字符串3)
- 将字符串1中的字符窜2替换成字符串3
-
字符串1.replace(字符串2,字符串3,N)
- 将字符串1中的字符窜2替换成字符串3,替换N次
message = 'how are you? i am fine! thank you! and you?'
result11 = message.replace('you', 'me')
print(result11) # how are me? i am fine! thank me! and me?
message = 'how are you? i am fine! thank you! and you?'
result12 = message.replace('you', 'me', 2)
print(result12) # how are me? i am fine! thank me! and you?
center\rjust\ljust\zfill
-
字符串1.center(长度, 字符)
- 将字符串1转换成指定长度新字符串,不够用指定的字符填充,原字符串居中显示
-
字符串1.rjust(长度, 字符)
- 将字符串1转换成指定长度新字符串,不够用指定的字符填充,原字符串居右显示
-
字符串1.ljust(长度, 字符)
- 将字符串1转换成指定长度新字符串,不够用指定的字符填充,原字符串居左显示
-
字符串1.zfill(长度)
- 将字符串1转换成指定长度新字符串,不够用’0’填充(字符串1.rjust(长度, ‘0’))
str1 = 'abc'
print(str1.center(9, '0')) # 000abc000
print(str1.center(8, 'x')) # xxabcxxx
print(str1.ljust(9, '0')) # abc000000
print(str1.rjust(9, '0')) # 000000abc
strip/rstrip/lstrip
- strip - 去掉字符串两边的空白
- lstrip - 去掉字符串左边的空白
- rstrip - 去掉字符串右边的空白
str2 = '\t abc 123 \n'
print(str2) # abc 123
print(str2.strip()) # abc 123
print(str2.lstrip()) # abc 123
print(str2.rstrip()) # abc 123
upper/lower/swapcase
-
upper() - 全大写
-
lower() - 全小写
-
swapcase() - 交换大小写
title/capitalize
-
title() - 标题的每个单词都大写
-
capitalize() - 首个单词大写
is系列
-
isalnum() - 是否是字母和数字组成,无法排除中文。
-
isalpha() - 是否是字母
-
isdecimal() - 是否只包含十进制数字
-
isdigit() - 是否全部数字(0-9)
-
isidentifier() - 是不是字母和下划线开头,其他都是字母、数字、下划线
-
islower() - 是否都是小写
-
isupper() - 是否都是大写
-
isspace() - 是否只包含空白字符
字符串判断
-
endswith(suffix[,start[,end]]) - 在指定区间[start,end),字符串是否是suffix结尾
-
startswith(prefix[,start[,end]]) -> bool - 在指定区间[start,end),字符串是否是prefix开头
partition类
-
partition(sep) -> (head,sep,tail)
- 从左至右,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组;
- 如没有有找到分隔符,就返回头、两个空元素的三元组;
- sep分割字符串必须指定
-
rpartition(sep) -> (head,sep,tail)
- 从右至左,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组;
- 如没有有找到分隔符,就返回头、两个空元素的三元组;
- sep分割字符串必须指定
课后作业
-
输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)
例如: 输入**'abcd1234 ’ ** 输出**‘bd24’**
# str1 = 'sdfasfddgdfihwo3847asd,c;ad,faf' str1 = input('请输入字符串:') print(str1[1::2]) print(''.join([str1[x] for x in range(len(str1)) if x % 2 == 1]))
-
输入用户名,判断用户名是否合法(用户名长度6~10位)
str2 = input('请输入用户名:') if 6 <= len(str2) <= 10: print('用户名合法') else: print('用户名不合法') print(''.join(['用户名合法' if 6 <= len(str2) <= 10 else '用户名不合法']))
-
输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)
例如: ‘abc’ — 合法 ‘123’ — 合法 ‘abc123a’ — 合法
str3 = input('请输入用户名:') flag = True for x in str3: if 'A' <= x <= 'Z' or 'a' <= x <= 'z' or '0' <= x <= '9': pass else: flag = False if flag: print('用户名合法') else: print('用户名不合法')
-
输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)
例如: ‘abc’ — 不合法 ‘123’ — 不合法 ‘abc123’ — 不合法 ‘Abc123ahs’ — 合法
str4 = input('请输入用户名:') if 'A' <= str4[0] <= 'Z': flag = True for x in str4[1:]: if 'A' <= x <= 'Z' or 'a' <= x <= 'z' or '0' <= x <= '9': pass else: flag = False if flag: print('用户名合法') elif not flag: print('用户名不合法') else: print('用户名不合法')
-
输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串
例如:输入**‘abc1shj23kls99+2kkk’** 输出:'123992’
str5 = input('请输入字符串:') print(''.join([x for x in str5 if x.isdigit()])) print(''.join([x for x in str5 if x.isnumeric()]))
-
输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用upper方法和自己写算法两种方式实现)
例如: 输入**‘a2h2klm12+’ ** 输出 'A2H2KLM12+'
str6 = input('请输入字符串:') print(str6.upper()) print(''.join([chr(ord(x1) - 32) if 'a' <= x1 <= 'z' else x1 for x1 in str6]))
-
输入一个小于1000的数字,产生对应的学号
例如: 输入**‘23’,输出’py1901023’** 输入**‘9’, 输出’py1901009’** 输入**‘123’,输出’py1901123’**
str7 = input('请输入数字:') print('py1901' + str7.zfill(3)) print('py1901' + str7.rjust(3, '0'))
-
输入一个字符串,统计字符串中非数字字母的字符的个数
例如: 输入**‘anc2+93-sj胡说’** 输出:4 输入**’===’** 输出:3
str8 = 'anc2+93-sj胡说' str8 = input('请输入字符串:') count = 0 for i in str8: if 'A' <= i <= 'Z' or 'a' <= i <= 'z' or '0' <= i <= '9': pass else: count += 1 print(count)
-
输入字符串,将字符串的开头和结尾变成’+’,产生一个新的字符串
例如: 输入字符串**‘abc123’, 输出’+bc12+’**
str9 = input('请输入字符串:') print('+' + str9[1:-1] + '+')
-
输入字符串,获取字符串的中间字符
例如: 输入**‘abc1234’** 输出:‘1’ 输入**‘abc123’** 输出**‘c1’**
str10 = input('请输入字符串:')
len1 = len(str10)
len2 = len1 // 2
if len1 % 2 == 1:
print(str10[len2])
else:
print(str10[len2 - 1] + str10[len2])
- 写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)
例如: 字符串1为:how are you? Im fine, Thank you! , 字符串2为:you, 打印8
# str111 = 'how are you? Im fine, Thank you!'
# str112 = 'you'
str111 = input('请输入字符串1:')
str112 = input('请输入字符串2:')
if str112 in str111:
new_str111 = str111.split(str112, 1)
print(len(new_str111[0]))
else:
print('字符串2不在字符串1中')
- 获取两个字符串中公共的字符
例如: 字符串1为:abc123, 字符串2为: huak3 , 打印:公共字符有:a3
str121 = 'abc!12@3'
str122 = 'h@ua!k3'
print(''.join([i for i in str122 if i in str121]))
print(''.join([i for i in str122 if str121.find(i) != -1]))