找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程(ಥ_ಥ)-CSDN博客
所属专栏: Python
目录
字符串的常见操作
格式化字符串
占位符
f-string
字符串的 format 方法
字符串的编码与解码
与数据验证相关的方法
字符串的拼接
字符串的去重操作
字符串的常见操作
字符串是Python中的不可变数据类型,在最开始时,我们只是简单地学习了字符串的使用,并未深入研究。既然字符串也是一种数据类型,那么它是否也和前面学习的列表、字典、集合这些数据类型一样有着大量的操作方法呢?答案是有的,我们今天就来深入学习这些方法。
方法名 | 说明 |
lower() | 将字符串str全部转成小写字母,结果为一个新的字符串 |
upper() | 将字符串str全部转成大写字母,结果为一个新的字符串 |
split(set=None) | 把str按照指定的分隔符sep进行分隔,分割之后的结果为列表类型,其中的元素便是被分割后的字符串 |
count(sub) | 结果为sub的这个字符串在str中出现的次数 |
find(sub) | 查询sub这个字符串在str中是否存在,如果不存在结果为-1,如果存在结果为sub首次出现的索引 |
index(sub) | 功能与find(相同,区别在于要查询的子串sub不存在时,程序报错 |
startswith(s) | 查询字符串str是否以字符串s开头 |
endswith(s) | 查询字符串str是否以字符串s结尾 |
replace(old, news) | 使用news替换字符串s中所有的old字符串,结果是一个新的字符串 |
center(width, fillchar) | 字符串str在指定的宽度范围内居中,可以使用fillchar进行填充 |
join(iter) | 在iter中的每个元素的后面都增加一个新的字符串str |
strip(chars) | 从字符串中去掉左侧和右侧chars中列出的字符串 |
lstrip(chars) | 从字符串中去掉左侧chars中列出的字符串 |
rstrip(chars) | 从字符串中去掉右侧chars中列出的字符串 |
代码演示:
str = 'Hello Python'print('开始一系列字符串操作')lower_str = str.lower()print('将字符串变成小写:',lower_str)upper_str = str.upper()print('将字符串变成大写:',upper_str)list = str.split(' ')print('以空格分割字符串:',list)count = str.count('o')print('字符串中"o"出现的次数:',count)a = str.find('o')b = str.index('o')print('字符串中"o"出现的索引位置:',a,b)print('字符串是不是以"hello"作为起始子串呢?',str.startswith('hello'))print('字符串是不是以"Hello"作为起始子串呢?',str.startswith('Hello'))print('字符串是不是以"python"作为结束子串呢?',str.endswith('python'))print('字符串是不是以"Python"作为起始子串呢?',str.endswith('Python'))
运行结果:
注意:在判断是否为起始子串、结束子串时,参数中的字符串不需要是子串,也可以是非子串。上述代码中的 "hello" 便是非子串。
从上述的结果,也可以看出字符串的相关操作并不会改变字符串本身。简单理解就是 全都是生成一个新的字符列表对象,然后在这个列表中进行一系列的操作,然后改成新的字符串返回。
我们再来通过代码实现剩下的方法操作。
代码演示:
str = 'Hello Python'# 替换字符串中的部分字符print(str.replace('Hello','Hi')) # 在最后面还可以指定参数print(str.replace('Hello','Hi',0)) # 指定替换0次,即不替换# 填充部分字符,是字符串在指定的范围内处于居中位置print(str.center(20)) # 在长度为20的空间中,默认使用空白字符填充,是字符串处于居中位置print(str.center(20, '*')) # 在上面的基础上,使用"*"进行填充print(str.center(10,'*')) # 当字符串本身超出 width 时,就直接打印输出# 在字符串str后面的每个字符元素中,加上" "(两个空格)print(' '.join(str))# 将 ' hhh ' 中的空格全部去掉(默认是去掉空格),再使用'*'去替换空格print(' hhh '.strip().replace(' ','*'))print(' hhh '.replace(' ','*'))# 观察上面两个的不同,或者写成下面这样print('***hhh***'.strip('*')) # 直接将'*'从字符串中去除print('***hhh***'.lstrip('*')) # 直接将左边'*'从字符串中去除print('***hhh***'.rstrip('*')) # 直接将右边'*'从字符串中去除# 注意下面这种情况,是不能成功去除的print('*1**hhh***'.lstrip('*')) # 在去除'*'字符的过程中,遇到非'*'字符之后,就会停止去除print('经过一系列的字符串操作之后,原字符串为:'+str)
运行结果:
格式化字符串
常见的格式化字符串方式有三种:1、占位符的形式;2、f-string的形式;3、str.format()的形式。
占位符
在Python中常用的占位符有三个:1、%s -> 代指字符串;2、%d -> 代指十进制的整数;3、%f -> 代指浮点数。
语法格式:
# 可以理解为是将后面的参数直接带入到 %s、%d、%f 中# 这里的 %s、%d、%f 只是占了个位置罢了,故名:占位符# str % () --> 字符串 % 元组,占位符使用元组来替代print('姓名: %s, 年龄: %d, 成绩: %f' % (name, age, score))
代码演示:
name = '马冬梅'age = 18score = 98.5# 使用了 .1f 之后,可以让浮点数只输出一位print('姓名:%s, 年龄:%d, 成绩:%f' % (name, age, score))print('姓名:%s, 年龄:%d, 成绩:%.1f' % (name, age, score))
除了上述 .1f 之外,还有 5d 这种写法,小数点后面的是保证位数,小数点前面的是保证输出总长度,当总长度小于我们设置的总长度时,就会使用空格填充,如果是 5d 的写法,就是填充在左边,也就是右对齐;反之,如果是 -5d 的写法,就是填充在右边,也就是左对齐的写法。 scanf与printf函数的详细介绍及其用法_printf 换行符-CSDN博客 可以去看这篇文章,介绍的比较详细,虽然是C语言,但是概念是差不多的(输出格式)。
f-string
语法格式:
# f-string ,使用的就是 fstring的形式# 这里是把要使用变量替代的全部放到了{}中,这样在打印时,就会将{}中的变量替换为真实的值print(f'姓名: {name}, 年龄: {age}, 成绩:{score}')
代码演示:
name = '马冬梅'age = 18score = 98.5# 使用f-stringprint(f'姓名:{name}, 年龄:{age}, 成绩:{score}')
字符串的 format 方法
语法格式:
# str.format() 与 f-string 有点类似,都是使用 {} 来标明需要替换的元素# 但是 f-string 是直接从上文中取,而 str.format 是从format参数中寻找# 0、1、2 对应的是 format参数中索引的位置,0 是 name的索引,所以就让 name 来替换0print('姓名: {0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))# 下面的写法也是符合要求的,2 是 name的索引,所以使用name来替换2print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))
代码演示:
name = '马冬梅'age = 18score = 98.5# 使用字符串的format方法print('姓名:{0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))# 上述的0、1、2指的是format方法中的参数的索引位置,可以写成下面这样print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))
上面三种格式化的方式,写在一起的运行结果:
格式化字符串的详细格式还是有很多的,下面来认识其他的格式。
代码演示:
s = 'Hello Python'# 直接使用0去代指format中的参数print('{0}'.format(s))# : 是引导符,表明后面开始的操作是对参数的格式化# * 是填充符,表明当长度不足时,使用 * 来填充# < 是向左对齐、20 是字符串的总长度,不足时使用填充符来填充print('{0:*<20}'.format(s))# ^ 居中对齐、- 使用"-"填充空闲的位置print('{0:-^20}'.format(s))# 超出长度,就啥也不做print('{0:*^5}'.format(s))# 默认使用 空白字符 填充print('{0:^20}'.format(s))
运行结果:
代码演示:
# 千位分隔符:只适用于整数与浮点数# 且针对浮点数时,只会将其整数部分进行分割,而小数部分不会做任何处理print('{0:,}'.format(1234567890))print('{0:,}'.format(1234567890.987654321))# .精度 ——> 参数为字符窜时,是显示最大的长度,参数为浮点数时,是显示小数的最大长度# 针对字符串时,不需要加f,而针对浮点数时,需要加上fprint('{0:.2f}'.format(3.1415926535))print('{0:.5}'.format('Hello Python'))# 类型a = 8print('二进制:{0:b}'.format(a))print('八进制:{0:o}'.format(a))print('十进制:{0:d}'.format(a))print('十六进制:{0:x}'.format(a))print('十六进制:{0:X}'.format(a))
运行结果:
字符串的编码与解码
我们现在所处的时代是互联网时代,通信的方式也是发生了变化。现在的通信主要是网络通信,一台机器上的数据经过一系列的处理变为了二进制数据,然后再通过网卡以二进制的形式传输出去(电信号的高低电平表示1与0、光信号的频率高低表示1与0) ,这些数据经过互联网就被另一台机器的网卡给接收到了,然后开始对二进制数据进行解析,变为最终通信的数据。上述过程就是不同机器的基本通信过程,如果想要详细了解,可以去看下面的文章。初始JavaEE篇 —— 网络编程(1):基础的网络知识-CSDN博客
在Python中,将字符串的转换为二进制数据的过程就称为编码的过程;反之,将二进制数据转换为字符串的过程就称为解码的过程。
在Python中,编码所使用的方法是 encode,解码所使用的方法是 decode。
语法格式:
# encoding 是指定要编码的方式,默认是utf-8# errors 是指定编码错误的处理方式,常见的有三种方式:# 1、strict ——> 遇到编码错误时,直接抛出异常。这也是默认的处理方式# 2、ignore ——> 直接忽略编码错误的字符,可以认为是直接跳过了这个字符,去处理后面的字符# 3、replace ——> 用 ? 去代替编码错误的字符str.encode(encoding='utf-8', errors='strict/ignore/replace')bytes.decode(encoding='utf-8', error='strict/ignore/replace')
代码演示:
# 编码过程s = 'Hello Python'print('原始的数据:%s' % s)s_encode = s.encode() # 都采用默认的方式print('编码之后的数据类型:',type(s_encode))print('编码之后的结果:',s_encode)# 解码过程s_decode = s_encode.decode() # 也是采用默认的方式print('解码之后的结果:%s' % s_decode)
运行结果:
上面是对于英文的编码与解码演示,从结果上面来看就是在要传输的基础上加了个前缀b,同样对于数字字符串也是如此,下面我们来看看中文的编码与解码。
代码演示:
# 编码过程s = '伟大的中国梦'print('原始的数据:%s' % s)s_encode = s.encode() # 都采用默认的方式print('编码之后的数据类型:',type(s_encode))print('编码之后的结果:',s_encode)# 解码过程s_decode = s_encode.decode() # 也是采用默认的方式print('解码之后的结果:%s' % s_decode)
运行结果:
从上面的对比,我们可以得出一个结论:对于英文字符与数字在经过UTF-8编码后,是不变的,而大多数汉字字符在经过UTF-8之后,一个汉字字符对应着三个编码后的字符。 这是因为在UTF-8编码中规定的是大多数的中文字符占三个字节,而在传统的gbk编码中,中文是占两个字节的,因此使用不同的编码方式,最终形成的字节数也是不同的。
我们接下来就来看编码与解码的方式不同,会出现什么样的问题。
当然我们也可以让其直接忽略或者是用?来替换
# 编码过程s = '伟大的中国梦'print('原始的数据:%s' % s)s_encode = s.encode() # 都采用默认的方式print('编码之后的数据类型:',type(s_encode))print('编码之后的结果:',s_encode)# 解码过程# 采用ascii码值的方式去解码,并且对解码错误的处理方式采用忽略。# 因为全部的编码都会解码失败,因此最终的解码结果就是啥也没有s_decode = s_encode.decode(encoding = 'ascii',errors='ignore') print('解码之后的结果:%s' % s_decode)
运行结果:
下面是使用replace的结果:
与数据验证相关的方法
数据的验证是指程序对用户输入的数据进行“合法”性验证。主要是使用以下八种方法:
方法名 | 说明 |
isdigit() | 所有的字符都是数字(只能是阿拉伯数字) |
isnumeric() | 所有的字符都是数字 |
isalpha() | 所有的字符都是字母(包含中文字符) |
isalnum() | 所有的字符都是数字或者字母(包含中文字符) |
islower() | 所有的字符都是小写 |
isupper() | 所有的字符都是大写 |
istitle() | 所有的字符都是首字母大写 |
isspace() | 所有的字符都是空白字符(制表符(\t)、换行符(\n)等) |
代码演示:
# 判断所有的字符都是数字# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字print('123'.isdigit()) # Trueprint('一二三'.isdigit()) # Falseprint('I'.isdigit()) # Falseprint('壹'.isdigit()) # Falseprint('b0101'.isdigit()) # Falseprint('-'*20)# 判断所有的字符都是数字# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字print('123'.isnumeric()) # Trueprint('一二三'.isnumeric()) # Trueprint('I'.isnumeric()) # Falseprint('壹'.isnumeric()) # Trueprint('b0101'.isnumeric()) # Falseprint('-'*20)# 判断所有的字符都是字母print('hello你好'.isalpha()) # Trueprint('hello你好123'.isalpha()) # Falseprint('hello 你好'.isalpha()) # Falseprint('-'*20)# 判断所有的字符都是数字或者字母print('hello你好'.isalnum()) # Trueprint('hello你好123'.isalnum()) # Trueprint('hello-你好-123'.isalnum()) # Falseprint('hello 你好'.isalnum()) # Falseprint('-'*20)# 所有的字符都是小写# 中文既是大写也是小写print('hello'.islower()) # Trueprint('hello你好'.islower()) # Trueprint('Hello'.islower()) # Falseprint('HELLO'.islower()) # Falseprint('-'*20)# 所有的字符都是大写# 中文既是大写也是小写print('hello'.isupper()) # Falseprint('hello你好'.isupper()) # Falseprint('Hello'.isupper()) # Falseprint('HELLO'.isupper()) # Trueprint('-'*20)# 所有的字符都是首字母大写# 通过 空格 来区分单词print('Hello'.istitle()) # Trueprint('HelloWorld'.istitle()) # Falseprint('Helloworld'.istitle()) # Trueprint('Hello World'.istitle()) # Trueprint('-'*20)# 所有的字符都是空白字符print(' '.isspace()) # Trueprint('\n'.isspace()) # Trueprint('\t'.isspace()) # Trueprint('123\t'.isspace()) # False
字符串的拼接
字符串的拼接是根据数据类型的不同,从而采取不同的方法。例如,当要拼接的数据类型是字符串本身时,完全可以使用 + 的直接拼接方法。
1、使用 str.join() 方法进行拼接字符串
2、直接使用"+"拼接字符串
3、使用格式化字符串进行拼接
代码演示:
s1 = 'hello's2 = 'python'# 1、采用 str.join()方法# 使用字符串的内容去替代参数中的元素之间的分隔符print(''.join([s1, s2]))print(''.join((s1, s2)))# 2、直接拼接print(s1+s2)# 简单粗暴的方式print('hello''python')# 3、采用格式化字符串的方式print(f'{s1}{s2}')print('{0}{1}'.format(s1, s2))
运行结果:
字符串的去重操作
当字符串中重复出现多个字符时,如果我们想去除重复的字符,拿到不重复的字符,就可以采用下面的方法。
1、遍历字符串,判断是否在新字符串中,不在则加上这个字符,最终遍历完成之后,得到的就是去重之后的字符串。
2、使用哈希的思想(就是使用集合),来去重。
代码演示:
s = 'hello worldhello worldhello worldhello world'# 1、遍历+判断:new_s1 = ''for char in s: if char not in new_s1: new_s1 += charprint(new_s1)new_s2 = ''for i in range(len(s)): if s[i] not in new_s2: new_s2 += s[i]print(new_s2)# 2、哈希思想去重new_s3 = set(s) # 得到的集合中只剩下不重复的元素了# 但因为集合是无序的,因此我们按照原来字符串的顺序来排序,需要转化为列表list_S = list(new_s3)# 将列表中的字符按照字符串中的索引来进行排序list_S.sort(key=s.index)# 最终再转换为字符串类型print(''.join(list_S))
运行结果:
好啦!本期 初始Python篇(6)—— 字符串 的学习之旅 就到此结束啦!我们下一期再一起学习吧!