字符串
-
字符
1.什么是字符串(str)
容器型数据类型; 将’‘、“”、’‘’‘’'、“”“”""作为容器的标志里面的每个符号就是字符串中元素。
不可变的(不支持增删改);有序的(支持下标操作)
元素(字符):可以是任何文字符号, 包括:数字、字母、汉字、日文、韩语、表情符号、标点等
任何文字符号都可以是字符串的元素转义字符
转义字符: \和指定的一些符号组合在一起表示特殊功能或者特殊意义的字符。 转义字符是C语言创建的,但是很多都已经没有存在的价值的,目前常用的转义字符: \n - 换行 \t - 水平制表符(相当于按一次tab键) \' - 表示一个普通的单引号 \" - 表示一个普通的双引号 \\ - 表示一个普通的反斜杠
注意:在字符串的最前面加r或者R,可以让字符串中所有的转义字符功能消失(让字符串中的所有字符自动变成普通字符
-
字符编码
1.编码值:
计算机存储数据的时候只能存数字(存的是数字对应的二进制的补码);
为了能够让计算机存储字符,给每个字符对应一个固定的数字,每次需要存储这个字符的时候就去存这个数字;
每个字符对应的那个数字就是这个字符的编码值。2.编码表
1)ASCII码表 - 有128个字符对应的编码值(只有包含英文符号和其他西欧语言对应的符号)
数字字符0~9从48开始连续递增
大写字母A~Z从65开始连续递增
小写字母a~z从97开始连续递增2)Unicode编码表(Python) - 是ASCII码表的扩展(包含了ASCII码表),包含了世界上所有国家所有民族所有语言的对应的符号(统一码、万国码)
中文范围:4e00 ~ 9fa5 十六进制的 在打印时要加上0x
chr(编码值) - 获取指定编码值对应的字符
print(chr(97), chr(65)) #a A
ord(字符) - 获取指定字符对应的编码
print(ord('屈'),ord('圣'),ord('杭')) #23624 22307 26477
-
字符串基本操作
查
字符串获取字符的语法和列表获取元素的语法一样。
str1 = 'good good study! day day up!' print(str1[3], str1[-2]) #d p
注意:不管转义字符的功能是什么,在计算字符串长度的时候一个转义字符的长度是1
str2 = '\tabc\n123\u4e00m' print(str2[1], str2[-3]) #a 3
切片
message = '小明的电话号码是:13678192303' print(message[-11:]) # '13678192303' print(message[3:-2:-2]) # '' print(message[1:-1:2]) # '明电号是16893'
遍历
str3 = 'hello python!' for x in str3: print(x)
字符串数学运算 +、*
2. 数学运算:+、* # 1) 字符串1 + 字符串2 - 将两个字符串合并产生一个新的字符串(字符串拼接) str1 = 'hello' str2 = 'world!' str3 = str1 + ' ' + str2 print(str3) # 2) 字符串 * N - 将字符串重复N次产生一个新的字符串 str4 = str1 * 3 print(str4)
案例:提取字符串中所有数字字符 # 'abc12MK89你好9' -> '12899' str1 = 'abc12MK89你好9' new_str = '' for x in str1: if '0' <= x <= '9': new_str += x print(new_str) # '12899' # ''+'1' -> '1' + '2' ->'12' + '8' -> '128' ... # 案例:在字符串中两个字符之前插入* # 'abc12' -> 'a*b*c*1*2' str1 = 'abc12' new_str = '' for x in str1: new_str += x + '*' print(new_str[0:-1]) # 练习:将字符串中所有的数字字符都替换成* # 'ab2Mk89你好8' -> 'ab*Mk**你好*' str1 = 'ab2Mk89你好8' new_str = '' for x in str1: if '0' <= x <= '9': new_str += '*' else: new_str += x print(new_str) # 'ab*Mk**你好*'
比较运算
判断相等:两个一模一样的字符串才相等
print('abc' == 'acb') # False
比较大小: 两个字符串比较大小,比较的是第一对不相等的字符的编码值的大小
判断x是否是数字字符: ‘0’ <= x <= ‘9’
判断x是否是小写字母: ‘a’ <= x <= ‘z’
判断x是否是大写字母: ‘A’ <= x <= ‘Z’
判断x是否是字母: ‘a’ <= x <= ‘z’ or ‘A’ <= x <= ‘Z’ 小写字母和大写之间还有其他符号
判断x是否是中文: ‘\u4e00’ <= x <= ‘\u9fa5’练习:分别统计字符串中中文和大写字母的数量 str1 = 'shfa换手机223--=2MjshUj行HSJSA' count1 = count2 = 0 for x in str1: if '\u4e00' <= x <= '\u9fa5': count1 += 1 elif 'A' <= x <= 'Z': count2 += 1 print(count1, count2)
字符串1 in 字符串2 - 判断字符串1是否是字符串2的子串(判断字符串2中是否包含字符串1)
print(10 in [10, 20, 30]) # True print([10, 20] in [10, 20, 30]) # False print('a' in 'abc123') # True print('abc' in 'abc123') # True print('ab1' in 'abc123') # False
str(数据) - 将指定数据转换成字符串
所有类型的数据都可以转换成字符串,转换的时候是在数据的打印值外面加引号
-
字符串相关方法
1字符串.join(序列) - 用指定字符串将序列中元素拼接成一个字符串(序列中的元素必须是字符串)
result = '+'.join(['name', 'age', 'gender']) print(result) # name+age+gender result = '=='.join('abc') print(result) # a==b==c nums = [10, 20, 30, 40] # '10+20+30+40' result = '+'.join([str(x) for x in nums]) print(result) # '10+20+30+40' list1 = [10, 'abc', '你好', 1.23, True, '手机壳'] # 'abc你好手机壳' result = ''.join([x for x in list1 if type(x) == str]) print(result) # 'abc你好手机壳'
练习:将列表中每个元素的第一个字符提取出来形成一个新的字符串: # ['name', 'age', 'gender'] -> 'nag' list1 = ['name', 'age', 'gender'] result = ''.join([x[0] for x in list1]) print(result)
2
字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割点对字符串1进行切割
字符串1.split(字符串2, N) - 将字符串1中前N个字符串2作为切割点对字符串1进行切割用字符串1中等于字符串2的元素去切字符串1
str1 = '123abc你好abc===abc+++' result = str1.split('abc') print(result) # ['123', '你好', '===', '+++'] result = str1.split('a') print(result) # ['123', 'bc你好', 'bc===', 'bc+++'] result = str1.split('abc', 2) print(result) # ['123', '你好', '===abc+++']
注意:如果切割点连续出现或者切割点在字符串的开头或者结果,切割的结果中会出现空串 str1 = 'abc123abcabc你好abc===abc+++abc' result = str1.split('abc') print(result) # ['', '123', '', '你好', '===', '+++', '']
3
# 字符串1.replace(字符串2, 字符串3) - 将字符串1中所有的字符串2都替换成字符串3
# 字符串1.replace(字符串2, 字符串3, N) - 将字符串1中前N个字符串2都替换成字符串3message = 'how are you? i am fine! thank you! and you?' result = message.replace('you', 'me') print(result) # how are me? i am fine! thank me! and me? result = message.replace('you', 'me', 1) print(result) # how are me? i am fine! thank you! and you? # 案例:删除字符串message中所有的空格符号 result = message.replace(' ', '') print(result) # howareyou?iamfine!thankyou!andyou?
4
# 字符串.strip() - 删除字符串前后两端的空白字符 把字符前后的空白删掉
# 字符串.strip(字符集) - 删除字符串前后两端的指定所有字符 把字符前后的指定字符删掉5
# 字符串1.find(字符串2) - 获取字符串2第一次出现在字符串1中的位置,如果字符串2不存在返回-1
获取的时字符串1的下标(字符串2出现在1中的下标 第一次,如果1中没有2 返回-1)
# 字符串1.index(字符串2) - 获取字符串2第一次出现在字符串1中的位置,如果字符串2不存报错
message = 'how are you? i am fine! thank you! and you?' print(message.find('you'), message.index('you')) print(message.find('abc')) # -1 # print(message.index('abc')) # 报错
在指定下标范围内找
# 字符串1.find(字符串2, 开始下标, 结束下标) - 在字符串1中指定范围内查找字符串2第一次出现的位置, 如果找不到返回-1 # 字符串1.index(字符串2, 开始下标, 结束下标) - 在字符串1中指定范围内查找字符串2第一次出现的位置, 如果找不到报错 message = 'how are you? i am fine! thank you! and you?' print(message.find('you', 0, 8)) # -1 print(message.find('you', 11)) # 30
find 前面加r 就从后往前找
# 字符串1.rfind(字符串2) - (从后往前找) # 字符串1.rindex(字符串2) - (从后往前找) message = 'how are you? i am fine! thank you! and you?' print(message.rfind('you')) # 39