字符串、字符编码、字符串相关操作及相关方法
什么是字符串
容器型数据类型:
将 ‘’、""、’’’ ‘’'作为容器标志
字符串不可变(不支持增删改),字符串有序(支持下标操作)
元素:引号中单独的每个符号都是字符串的元素(又叫字符),字符可以是任何符号
字符分为两类:普通字符 转义字符(具有特殊意义的字符)
字符串有序(支持下标操作);不可变
1、下标操作 — 单个获取、切片、遍历
- 单个获取
string = 'Python-2104'
# 字符串[下标]
print(string[0]) #P
print(string[6]) #-
- 切片
# 字符串[开始下标:结束下标:步长] (省略下标及步长参照列表)
print(string[0:5]) #Python
print(string[:-5:-1]) #4012
print(string[:]) #Python-2104
- 遍历
- 通过元素遍历
for item in 字符串:
循环体
for item in string:
print(item,end=' ') #P y t h o n - 2 1 0 4
print()
- 通过下标遍历
for index in range(len(字符串)):
循环体
for index in range(len(string)):
print(string[index],end=' ') #P y t h o n - 2 1 0 4
print()
- 枚举
for index,item in enumerate(字符串):
循环体
for index,item in enumerate(string):
print(index,item,sep=' ')
字符编码
字符编码:
1、编码
计算机只能直接存储数字(而且保存是数字的二进制补码),文字符号无法直接保存至计算机中
为了能够让计算机具备存储文字符号的功能,我们给所有文字符号对应了一个固定的数字,
每次要存储符号的时候就把符号对应的数字存起来
符号对应的数字就是符号的编码值
2、编码表 — 保存符号和数字对应关系的表
1、ASCII码表
a)、总共有128个字符(美国符号:英文输入法)
b)、数字在字母前面,大写字母在小写字母前面。大写字母与小写字母不连续
2、Unicode编码表(Python)
a)、Unicode编码表是对ASCII表的扩展,包含了世界上所有国家所有民族的所有语言的符号(又称万国码,共
65536个)
b)、中文范围:4e00 - 9fa5
3、编码值在Python中的使用
a)、chr函数:chr(编码值) — 获取编码值对应的字符
b)、ord函数:ord(字符) — 获取字符编码值
c)、\ u4e00(4e00就是一个16进制的编码值)
注意:python中需要字符的地方都必须使用长度为1的字符串赋值
# chr()
print(chr(97)) # a
print('第一个中文字符:', chr(0x4e00))
print('最后一个中文字符:', chr(0x9fa5))
number = 0
for item in range(0x4e00, 0x9fa5 + 1): # 打印Unicode中所有的中文 0x0700,0x074F + 1(叙利亚文)
print(chr(item), end=' ')
number += 1
if (number == 30):
print()
number = 0
#ord()
print(ord('蜘'), ord('蛛'), ord('侠')) # 34584 34523 20384
# 将大写字母转换为对应的小写字母
chart = input('请输入要转换的字母:')
while (1):
if (ord('z') >= ord(chart) >= ord('a')):
print(chr(ord(chart) - 32))
break
if (ord('Z') >= ord(chart) >= ord('A')):
print(chr(ord(chart) + 32))
break
#为了体现这两个函数才这么写的
转义字符
转义字符 — 在特定符号前加 \ 让符号具备特殊功能 常用转义字符:
\ n — 换行
\ t — 水平制表符(跳格)
\ ’ — 表示一个普通的单引号
\ " — 表示一个普通的双引号
\ \ — 表示一个普通的反斜杠
\ u — 4位的十六进制数 — 编码字符
str3 = '\u4eff'
print(str3)
字符串相关操作
+、*、比较运算、in、not in
-
‘+’ — 合并字符串
字符串1 + 字符串2 = 字符串3(字符串1字符串2)
string1 = 'Python'
string2 = '-'
string3 = '2104'
string4 = string1 + string2 + string3
print(string4) #Python-2104
# 练习:提取字符中小写字母
# 'ss试试看78,mvn0-k=上课23' -> 'ssmvnk'
str2 = 'ss试试看78,mvn0-k=上课23'
new_str2 = ''
for char in str2:
if(97 <= ord(char) <= 122):
new_str2 += char
print(new_str2) #ssmvnk
- ‘*’ — 将字符串重复N遍
字符串1 * N
string6 = string1 * 5
print(string6) #PythonPythonPythonPythonPython
-
比较运算 — 比较字符串1与字符串2的第一对不相等字符编码值的大小
字符串1 (< / > / <= / >= / == / !=) 字符串2
判断是否是数字字符:‘0’ <= char <= ‘9’
判断是否是小写字母:‘a’ <= char <= ‘z’
判断是否是大写字母:‘A’ <= char <= ‘Z’
判断是否是字母: ‘a’ <= char <= ‘z’ or ‘A’ <= char <= ‘Z’
判断是否是中文: ‘\ u4e00’ <= char <= ‘\ u9fa5’
string7 = 'python ' string8 = 'Python' print(string7 > string8) #True print(string7 < string8) #False print(string7 == string8) #False print(string7 != string8) #True print('Zasddf' > 'zasddf') #False
# 练习:
str3 = '你好loe--23=sks;M9JHkyu是-12山卡拉'
# 1)统计中文字符的个数
count = 0
# 通过编码值比较获取
# for char in str3:
# if(0x4e00 <= ord(char) <= 0x9fa5):
# count += 1
# 通过字符比较获取
for char in str3:
if('\u4e00' <= char <= '\u9fa5'):
count += 1
print('中文字符的个数为:',count)
# 2)打印字符串中所有的数字字符
print('字符串中所有的数字字符:',end=' ')
for char in str3:
if('0' < char < '9'):
print(char,end=' ')
print()
# 3)提取字符串中所有的字母
str4 = ''
for char in str3:
if('a' <= char <= 'z' or 'A' <= char <= 'Z'):
str4 += char
print('字符串中所有的字母为:',str4)
-
in 和 not in — 判断字符串2中是否包含字符串1(字符串1是否是字符串2子串)
注意:这里区分大小写(编码值的不同)!
print('9' in '999zzx') #True
print('zzx' in '999zzx') #True
print('zzx' in 'zz99x9') #False
- len(字符串) — 获取字符串长度(只要是引号里的都算)
print(len(string7)) #7
print(len(string8)) #6
print(len('1,2,3')) #5
-
str() — 将数据(任何类型的数据)转换为字符串
转换的时候是在数据打印值外加括号
number = 123
print(type(number))
number1 = str(number) #<class 'int'>
print(type(number1)) #<class 'str'> '123'
print(type(number)) #<class 'int'> 原来的number类型不变
numbers = [1,2,3,4]
numbers1 = str(numbers)
print(type(numbers),numbers) #<class 'int'> [1, 2, 3, 4]
print(type(numbers1),numbers1) #<class 'str'> '[1, 2, 3, 4]'
numbers2 = {'a':1,'b':2}
numbers3 = str(numbers2)
print(type(numbers3),numbers3) #<class 'str'> "{'a': 1, 'b': 2}"
numbers4 = (1,2,(3,4))
numbers5 = str(numbers4)
print(type(numbers5),numbers5) #<class 'str'> '(1, 2, (3, 4))'
print(str(lambda x: x * 2)) #'<function <lambda> at 0x000001DA2BEA5040>'
-
r语法(r-string) — 在字符串前面加r(阻止转移)
若在字符串前面添加r®,那么字符串中所有转义字符的功能都将消失不在具有特殊功能
str5 = '999\nzzx'
new_str5 = R'999\nzzx'
# 应用:表示路径
# path = 'E:\Python\name\code\a.txt'
# 其他语言:在所有'\'后加一个'\' --- path = 'E:\\Python\\name\\code\\a.txt'
# python:
path = r'E:\Python\name\code\a.txt'
print(path) #E:\Python\name\code\a.txt
- eval(字符串) — 去掉字符串最外层引号,获取数据。若去掉引号后是一个表达式。则将计算其结果
result1 = eval('100')
print(result1) #100
result2 = eval('[999, 999]')
print(result2) #[999, 999]
result3 = eval('999 + 1')
print(result3) #1000
只列举了一些常用函数字符串所有相关函数如下(截图自菜鸟教程):
字符串相关方法
join()
字符串(拼接符).join(序列) — 将序列中的元素用指定的字符串拼接成一个字符串(序列中的元素必须是字符串)
list1 = ['zzx','999','hhh']
str1 = ''.join(list1)
print(str1) #zzx999hhh
str2 = '+'.join(list1)
print(str2) #zzx+999+hhh
str3 = 'king'.join(list1)
print(str3) #zzxking999kinghhh
list2 = ['zzx', 999, 111]
str4 = ''.join([str(item) for item in list2])
print(str4) #zzx999111
练习:将list2中所有的字符串拼接成一个字符串
list3 = ['abc', 100, True, 'hello'] # abchello
str5 = ''.join([i for i in list3 if type(i) == str])
print(str5) #abchello
count()
字符串1.count(字符串2) — 统计字符串1中字符串2出现的次数
message = 'how are you? i am fine! thank you! and you?'
times = message.count('you')
print(times) #3
index / find
字符串1.index(字符串2) — 获取字符串2第一次出现在字符串1中的位置(位置是从0开始的下标值)
字符串1.find(字符串2) — 获取字符串2第一次出现在字符串1中的位置(位置是从0开始的下标值)
在字符串2不存在的时候index会报错,find不会报错而返回-1
rfind / rindex — 从右往左数(最后一个)
result1 = message.index('you')
print(result1) #8
result2 = message.find('you')
print(result2) #8
# result3 = message.index('zzx')
# print(result3) #ValueError: substring not found 报错
result4 = message.find('zzx')
print(result4) # -1
split()
字符串1.split(字符串2) — 将字符串1中所有的字符串2作为切割点对字符串1进行切割(结果用列表返回)
字符串1.split(字符串2,N) — 最多切N次
message = 'mnabc123abcxyzabcoop'
result5 = message.split('abc')
print(result5) #['mn', '123', 'xyz', 'oop']
注意:如果切割点怎么分布,切完后小字符串的个数都是切割点的数量加1
message = 'abcmnabc123abcabcxyzabcoopabc'
result6 = message.split('abc')
print(result6) #['', 'mn', '123', '', 'xyz', 'oop', '']
message = 'mnabc123abcxyzabcoop'
result7 = message.split('abc',1)
print(result7) #['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?'
result8 = message.replace('you','me')
print(result8) #how are me? i am fine! thank me! and me?
message = 'how are you? i am fine! thank you! and you?'
result9 = message.replace('you','me',2)
print(result9) #how are me? i am fine! thank me! and you?
center() / rjust() / ljust() / zfill()
字符串.center(长度,填充字符) — 将字符串转换成指定长度的字符串,长度不够用填充字符补充,原字符串居中显
示
字符串.rjust(长度,填充字符) — 将字符串转换成指定长度的字符串,长度不够用填充字符补充,原字符串靠右显示
字符串.ljust(长度,填充字符) — 将字符串转换成指定长度的字符串,长度不够用填充字符补充,原字符串靠左显示
字符串.zfill(长度) == 字符串.rjust(长度,‘0’)
str6 = 'zzx'
print(str6.center(9,'9')) #999zzx999
print(str6.center(8,'9')) #99zzx999 不等时后面填充长度大于前面
其余用法同center()
strip / rstrip / lstrip
strip — 同时去掉字符串两边所有的空白
rstrip — 去掉字符串右边所有的空白
lstrip — 去掉字符串左边所有的空白
str7 = '\t zzx 999 hello '
print(str7.strip()) #zzx 999 hello
其余用法同strip()
练习
-
输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)
例如: 输入**'abcd1234 ’ ** 输出**‘bd24’**
string = 'zhzexl9l9o9w*o*r*d' print(string,'所有奇数位上的字符为:') for index in range(1,len(string),2): print(string[index],end=' ') print()
-
输入用户名,判断用户名是否合法(用户名长度6~10位)
user_name = input('请输入用户名:') if(6 <= len(user_name) <= 10): print('用户名合法!') else: print('用户名不合法!')
-
输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)
例如: ‘abc’ — 合法 ‘123’ — 合法 ‘abc123a’ — 合法
user_name1 = input('请输入用户名:') for char in user_name1: if('a' <= char <= 'z' or 'A' <= char <= 'Z' or '0' <= char <= '9'): continue else: print('用户名不合法!') break else: print('用户名合法!')
-
输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)
例如: ‘abc’ — 不合法 ‘123’ — 不合法 ‘abc123’ — 不合法 ‘Abc123ahs’ — 合法
user_name2 = input('请输入用户名:') numbers_count = letter_count = 0 if('Z' < user_name2[0] or user_name2[0] < 'A'): print('用户名不合法!') else: for char in user_name2: if ('a' <= char <= 'z' or 'A' <= char <= 'Z'): letter_count += 1 continue elif('0' <= char <='9'): numbers_count += 1 continue else: print('用户名不合法!') break if(numbers_count >= 1 and letter_count >= 1): print('用户名合法!')
-
输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串
例如:输入**‘abc1shj23kls99+2kkk’** 输出:'123992’
string1 = input('请输入一个字符串:')
new_string1 = ''
for char in string1:
if('9' >= char >= '0'):
new_string1 += char
if(not new_string1):
print('字符串中没有数字字符!')
else:
print('字符串中所有的数字字符:',new_string1)
-
输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用upper方法和自己写算法两种方式实现)
例如: 输入**‘a2h2klm12+’ ** 输出 'A2H2KLM12+'
string2 = input('请输入一个字符串:')
# 方法一:upper()函数
# string3 = string2.upper()
# print(string3)
# 方法二:
for char in string2:
if('z' >= char >= 'a'):
print(chr(ord(char) - 32),end='')
else:
print(char,end='')
print()
#方法三:
new_string2 = ''.join([chr(ord(char) - 32) if 'z' >= char >= 'a' else char for char in string2])
print('字符串中所有的小写字母变成对应的大写字母为:',new_string2)
-
输入一个小于1000的数字,产生对应的学号
例如: 输入**‘23’,输出’py1901023’** 输入**‘9’, 输出’py1901009’** 输入**‘123’,输出’py1901123’**
school_number = input('请输入一个小于1000的数:')
string4 = 'py1901'
print('您的学号是:',string4 + school_number.zfill(3))
-
输入一个字符串,统计字符串中非数字字母的字符的个数
例如: 输入**‘anc2+93-sj胡说’** 输出:4 输入**’===’** 输出:3
string5 = input('请输入一个字符串:')
count = 0
for char in string5:
if('a' <= char <= 'z' or 'A' <= char <= 'Z' or '0' <= char <= '9'):
continue
else:
count += 1
print('字符串中非数字字母的字符的个数为:',count)
# 方法二:
string6 = input('请输入一个字符串:')
new_string6 = '+' + string6[1:-1] + '+'
-
输入字符串,将字符串的开头和结尾变成’+’,产生一个新的字符串
例如: 输入字符串**‘abc123’, 输出’+bc12+’**
string6 = input('请输入一个字符串:') string7 = '+' for index in range(1,len(string6) - 1): string7 += string6[index] else: string7 += '+' print('将字符串的开头和结尾变成+为:',string7)
-
输入字符串,获取字符串的中间字符
例如: 输入**‘abc1234’** 输出:‘1’ 输入**‘abc123’** 输出**‘c1’**
string8 = input('请输入一个字符串:')
string8_length = len(string8)
if(string8_length % 2):
print('字符串的中间字符为:',string8[string8_length // 2])
else:
print('字符串的中间字符为:',string8[string8_length // 2 - 1],string8[string8_length // 2])
- 写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)
例如: 字符串1为:how are you? Im fine, Thank you! , 字符串2为:you, 打印8
string9 = 'how are you ? Im fine , Thank you !'
string10 = 'you'
for index in range(len(string9)):
if(string10[0] == string9[index] and string10[1] == string9[index + 1]and string10[2] == string9[index + 2]):
print(string9,'中',string10,'第一次出现的位置是:',index)
break
else:
print(string9,'中没有',string10)
#方法二
string9_length = len(string9)
string10_length = len(string10)
for index in range(string9_length - 2):
if(string9[index : index + string10_length] == string10):
print(string9,'中',string10,'第一次出现的位置是:',index)
break
else:
print(string9,'中没有',string10)
- 获取两个字符串中公共的字符
例如: 字符串1为:abc123, 字符串2为: huak3 , 打印:公共字符有:a3
string11 = input('请输入一个字符串:')
string12 = input('请输入一个字符串:')
same_string = ''
for char1 in string11:
for char2 in string12:
if(char1 == char2 and char1 not in same_string):
same_string += char1
print('两个字符串中公共的字符:',same_string)