编程语言应用

注册

 

发新话题 回复该主题

站长在线零基础Python完全自学教程1 [复制链接]

1#

欢迎你来到站长学堂,学习站长在线出品的在线课程《零基础Python完全自学教程》今天给大家分享的是第19课《Python中字符串完全解读》。本节课是一个大课,我分了这些知识点进行详细讲解:字符串编码转换:encode编码和decode解码详解、使用“+”运算符来拼接字符串详解、使用len()函数计算字符串的长度详解、使用索引和切片的方法截取字符串详解、使用split()方法分割、使用join()方法合并字符串详解、检索字符串的5大方法详解、字符串中字母的大小写转换的4大方法详解、去除字符串中的空格和特殊字符的4个方法详解、格式化字符串的两种方法详解。

我们在《Python中的基本数据类型》中,学习过:字符串就是连续的字符序列,可以是计算机能够表示的一切字符的集合。字符串属于不可变序列,通常用单引号()、双引号("")或者三引号(或"""""")括起来。还提到了字符串常用的转义字符。今天主要来讲解一下字符串编码转换。

19.1:Python中字符串编码转换encode编码和decode解码详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《Python中字符串编码转换:encode编码和decode解码详解》。本知识点主要内容有:常用编码简介、使用encode()方法编码、使用decode()方法解码、Unicode和UTF-8的关系说明。

19.1.1、常用编码简介

19.1.1.1、ASCII,即美国标准信息交换码,年制定,主要用于美国和西欧,它仅对10个数字、26个大写英文字母、26个小写英文字母,以及一些其他符号进行了编码。ASCII码最多只能表示个符号,每个字符占一个字节(bytes)。

19.1.1.2、GB,国家简体中文字符集,年制定,兼容ASCII。每个中文字符占两个字节。

19.1.1.3、Unicode,国际标准组织统一标准字符集,年制定。Unicode包含了跟全球所有国家编码的映射关系。每个字符占两个字节。

19.1.1.4、UTF-8,国际通用编码,制定于年,对全世界所有国家用到的字符都进行了编码。UTF-8采用一个字节表示英文字符,用三个字节表示中文。在Python3.x中默认的编码就是UTF-8编码,这就有效的解决了中文乱码的问题。

19.1.1.5、GBK,为GB的扩展字符集,兼容GB,支持繁体字,年制定。每个中文字符占两个字节。

在Python中,有两种常用的字符串类型,分别为str和bytes。其中,str表示Unicode字符(ASCII或者其他);bytes表示二进制数据(包括编码的文本)。这两种类型的字符串不能拼接在一起使用。通常情况下,str在内存中以Unicode表示,一个字符对应若干个字节。但是如果在网络上传输,或者保存到磁盘上,就需要把str转换为字节类型,即bytes类型。

bytes类型的数据是带有b前缀的字符串(用单引号或双引号表示),例如,b\xd2\xb0和bQQ都是bytes类型的数据。

str和bytes之间可以通过encode()和decode()方法进行转换,这两个方法是互为逆过程。下面分别进行介绍。

19.1.2、使用encode()方法编码

encode()方法为str对象的方法,用于将字符串转换为二进制数据(即bytes),也称为“编码”,其语法格式如下:

str.encode([encoding="utf-8"][,errors="strict"])

参数说明如下:

str:表示要进行转换的字符串。

encoding="utf-8":可选参数,用于指定进行转码时采用的字符编码,默认为UTF-8,如果想使用简体中文,也可以设置为gb。当只有这一个参数时,也可以省略前面的“encoding=”,直接写编码。

errors="strict":可选参数,用于指定错误处理方式,其可选择值可以是strict(遇到非法字符就抛出异常)、ignore(忽略非法字符)、replace(用“?”替换非法字符)或xmlcharrefreplace(使用XML的字符引用)等,默认值为strict。

说明

在使用encode()方法时,不会修改原字符串,如果需要修改原字符串,需要对其进行重新赋值。

例如,定义一个名称为a的字符串,内容为“星星之火可以燎原”,然后使用encode()方法将其采用GBK编码转换为二进制数,并输出原字符串和转换后的内容,代码如下:

a=星星之火可以燎原b=a.encode(gbk)#将gbk编码转换为二进制数据,不处理异常print(原字符串:,a)#输出原字符串print(转换后:,b)#输出转换后的二进制数据

上面的代码执行后,将显示以下内容。

原字符串:星星之火可以燎原转换后:b\xd0\xc7\xd0\xc7\xd6\xae\xbb\xf0\xbf\xc9\xd2\xd4\xc1\xc7\xd4\xad

如果采用UTF-8编码,转换后的二进制数据为:

a=星星之火可以燎原b=a.encode(utf-8)#将utf-8编码转换为二进制数据,不处理异常print(原字符串:,a)#输出原字符串print(转换后:,b)#输出转换后的二进制数据

原字符串:星星之火可以燎原转换后:b\xe6\x98\x9f\xe6\x98\x9f\xe4\xb9\x8b\xe7\x81\xab\xe5\x8f\xaf\xe4\xbb\xa5\xe7\x87\x8e\xe5\x8e\x9f

19.1.3、使用decode()方法解码

decode()方法为bytes对象的方法,用于将二进制数据转换为字符串,即将使用encode()方法转换的结果再转换为字符串,也称为“解码”。

其语法格式如下:

bytes.decode([encoding="utf-8"][,errors="strict"])

参数说明如下:

bytes:表示要进行转换的二进制数据,通常是encode()方法转换的结果。

encoding="utf-8":可选参数,用于指定进行解码时采用的字符编码,默认为UTF-8,如果想使用简体中文,也可以设置为gb。当只有这一个参数时,也可以省略前面的“encoding=”,直接写编码。

errors="strict":可选参数,用于指定错误处理方式,其可选择值可以是strict(遇到非法字符就抛出异常)、ignore(忽略非法字符)、replace(用“?”替换非法字符)或xmlcharrefreplace(使用XML的字符引用)等,默认值为strict。

站长在线提醒您:在使用decode()方法时,不会修改原字符串,如果需要修改原字符串,需要对其进行重新赋值。

例如,将上面示例中编码后得到二进制数据(保存在变量b中)进行解码,可以使用下面的代码:

a=b\xd0\xc7\xd0\xc7\xd6\xae\xbb\xf0\xbf\xc9\xd2\xd4\xc1\xc7\xd4\xadprint(解码后:,a.decode("gbk"))#对进行制数据进行解码

上面的代码执行后,将显示以下内容:

解码后:星星之火可以燎原

同样的,我们选择utf-8的字符串也是可以的

a=b\xe6\x98\x9f\xe6\x98\x9f\xe4\xb9\x8b\xe7\x81\xab\xe5\x8f\xaf\xe4\xbb\xa5\xe7\x87\x8e\xe5\x8e\x9fprint(解码后:,a.decode("utf-8"))#对进行制数据进行解码

上面的代码执行后,将显示以下内容:

解码后:星星之火可以燎原

站长在线提醒您:在设置解码采用的字符编码时,需要与编码时采用的字符编码一致。

本文相关知识扩展阅读:

19.1.4、Unicode和UTF-8的关系说明

Unicode直接支持全球所有语言,包含了跟全球所有国家编码的映射关系。

Unicode解决了字符和二进制的对应关系,但是使用unicode的每一个字符,都占用了两个字节,太浪费空间。如unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。

由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那就不能这样传输了。

为了解决存储和网络传输的问题,出现了UnicodeTransformationformat,学术名UTF,即:对unicode中的进行格式转换,以便于在存储和网络传输时可以节省空间!

UTF-8:使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚语系占3个,其它及特殊字符占4个。

UTF-16:使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。

UTF-32:使用4个字节表示所有字符。

总结:UTF是为unicode编码设计的一种在存储和传输时节省空间的编码方案。

19.2:在Python中使用“+”运算符来拼接字符串详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用“+”运算符来拼接字符串详解》。本知识点主要内容有:在Python中,我们可以使用“+”运算符来连接多个字符串,并产生新的字符串对象。以及字符串与其他类型的数据拼接的时候出现的异常及解决办法。

上一个知识点我们讲到了字符串的常用编码,以及使用encode()方法编码和使用decode()方法解码,今天来大家分享的是字符串的常用操作中的拼接字符串。

在Python中,我们可以使用“+”运算符来连接多个字符串,并产生新的字符串对象。(多合一)

例如,定义两个字符串,一个用于保存英文,另一个用于保存中文,然后使用“+”运算符来连接,代码如下:

en=hello,world!cn=你好,世界!print(en++cn)

运行结果为:

hello,world!你好,世界!

字符串不允许直接与其他类型的数据拼接。比如下面代码,就是将字符串与数值拼接,就会产生TypeError异常:

str1=Python诞生于num1=str2=年圣诞节期间,num2=str3=年第一个公开版正式发行。print(str1+num1+str2+num2+str3)

运行结果为:

Traceback(mostrecentcalllast):File"D:\Python\Python\Doc\.py",line6,inmoduleprint(str1+num1+str2+num2+str3)TypeError:canonlyconcatenatestr(not"int")tostr

哈哈哈,我的英语差,我最喜欢把英文错误的提示,翻译出来:(希望小白的你,能够和我一样的做法)TypeError:canonlyconcatenatestr(not"int")tostr翻译为:TypeError:只能将str(而不是“int”)连接到str。

这样翻译一下,我就懂了,就是说:类型不合适引发的错误:只能将字符串类型数据而不是整型数据连接到字符串类型数据。

通过IDE里面直接给出了错误的提示,我们来解决问题就很容易了。我们可以使用str()函数将整数转换为字符串就可以了。代码如下:

str1=Python诞生于num1=str2=年圣诞节期间,num2=str3=年第一个公开版正式发行。print(str1+str(num1)+str2+str(num2)+str3)

运行结果为:

Python诞生于年圣诞节期间,年第一个公开版正式发行。

这下就非常的完美了。

上面输出的是一行的,下面我在来演示一个换行的。

如:定义一个用于保存老师的问题的字符串,再定义一个用于保存学生回答的答案的字符串,再将两个字符串拼接在一起,并且在中间拼接一个换行符,最后输出,代码如下:

wen=老师问:世界上最高的山峰是什么?da=学生答:珠穆朗玛峰print(wen+\n+da)

运行结果为:

老师问:世界上最高的山峰是什么?学生答:珠穆朗玛峰

使用“+”运算符来连接多个字符串是不是非常的简单呢?稍后,我们会讲到分割和合并字符串的时候,会讲到使用join()方法来合并字符串,本文就不多严罗!

19.3:在Python中使用len()函数计算字符串的长度详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用len()函数计算字符串的长度详解》。本知识点主要内容有:在Python中使用len()函数计算字符串在UTF-8编码中的长度和使用len()函数计算字符串在GBK编码中的长度。

在Python中,不同的字符采用的编码不同,所占用的字节数也是不同的。要想计算字符串的长度,先了解字符所占用的字节数。

我们在字符串的编码转换中学过,汉字在GBK/GB中一个中文字符,占两个字节。在UTF-8中一般占3个字节(或者4个字节)。

在Python中,提供了len()函数计算字符串的长度,其语法如下:

len(string)

其中,string用于指定要进行长度统计的字符串。

例如,定义一个字符串,内容为“Python是当下最热门的编程语言”,然后应用len()函数计算该字符串的长度,代码如下:

str=Python是当下最热门的编程语言#定义字符串a=len(str)#计算字符串的长度print(a)#输出字符串的长度

运行结果为:

17

从上面的结果可以看出,在默认的情况下,通过len()函数计算字符串的长度时,不区分英文,数字和汉字,所有的字符都认为是一个字符。

但是在实际开发中,需要获取字符串实际所占用的字节数。如果采用gbk或者gb编码,则一个汉字占用两个字节;采用utf-8编码,则一个汉字占用3个字节。这时,我们可以通过encode()方法进行编码后再进行获取。

19.3.1、采用默认编码UTF-8编码时,获取字符串“Python是当下最热门的编程语言”的长度,代码为:

str=Python是当下最热门的编程语言#定义字符串a=len(str.encode(utf-8))#计算utf-8编码的字符串的长度print(a)#输出字符串的长度

运行结果为:

39

为什么是39呢?是因为在utf-8的编码中,一个汉字占3个字节,一共11个汉字就是33个字节,加上6个英文字母占6个字节,就是39个字节了。

下面我们在来使用GBK编码的长度时多少?

19.3.2、用默认编码GBK编码时,获取字符串“Python是当下最热门的编程语言”的长度,代码为:

str=Python是当下最热门的编程语言#定义字符串a=len(str.encode(gbk))#计算gbk编码的字符串的长度print(a)#输出字符串的长度

运行结果为:

28

为什么是28呢?因为在GBK的编码中,一个汉字占2个字节,一共11个汉字占22个字节,加上6个英文字母占6个字节,就是28个字节了。

站长在线提醒您,因为UTF-8编码是Python3中的默认编码,在进行计算编码时,可以不用输入。即下面代码也是对的:

str=Python是当下最热门的编程语言#定义字符串a=len(str.encode())#计算默认编码utf-8编码的字符串的长度print(a)#输出字符串的长度

运行结果为:

39

19.4:在Python中使用索引和切片的方法截取字符串详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用索引和切片的方法截取字符串详解》。本知识点主要内容有:使用索引的方法截取一个字符串和使用切片的方法截取一段字符串。

字符串也是属于序列,在Python中如果是截取一个字符串,可以使用索引的的方法,如果截取一段字符串可以使用切片的方法。

19.4.1、使用索引的方法截取一个字符串。

方法如下:

string[index]

其中。string为字符串名字,index表示索引值。

定义一个字符串的值为“Python是当下最热门的编程语言”获取他的第2个,第8个和倒数第2个的字符串的值,代码如下:

a=Python是当下最热门的编程语言#定义一个字符串print(a[1])#获取字符串的第2个的值print(a[7])#获取字符串的第8个的值print(a[-2])#获取字符串的倒数第2个的值

运行结果如下:

y当语

当索引不存在时,就会抛出IndexError异常:

a=Python是当下最热门的编程语言#定义一个字符串print(a[25])#获取字符串的第25个的值

运行结果为:

Traceback(mostrecentcalllast):File"D:\Python\Python\Doc\.py",line2,inmoduleprint(a[25])#获取字符串的第25个的值IndexError:stringindexoutofrange

昨天站长在线分享了《Python内置异常速查表》知道IndexError这是索引超出范围引发的错误。

要解决这个异常的问题,我们可以使用try...except语句,代码如下:

a=Python是当下最热门的编程语言#定义一个字符串try:a1=a[25]#截取第25个字符except:print(指定的索引不存在)#输出指定的索引不存在

运行结果为:

指定的索引不存在

19.4.2、使用切片的方法截取一段字符串。

方法如下:

string[start:end:step]

其中,相关参数说明如下:

string:表示要截取的字符串;

start:表示要截取的第一个字符的索引(包括该字符),如果不指定,则默认为0;

end:表示要截取的最后一个字符的索引(不包括该字符),如果不指定,则默认为字符串的长度;

step:表示切片的步长,如果省略,则默认为1,当省略该步长时,最后一个冒号也可以省略。

例如,定义一个字符串,然后应用切片方法截取不同长度的字符串,并输出,代码如下:

a=Python是当下最热门的编程语言#定义一个字符串a1=a[0]#截取字符串的第一个值a2=a[6:]#从字符串的第7个值开始截取a3=a[:6]#从字符串的左边开始截取6个字符a4=a[6:10]#截取字符串的第7到第10个字符print(原字符串:,a)#输出原字符串print(截取字符串的第一个值为:,a1)print(从字符串的第7个值开始截取的值为:,a2)print(从字符串的左边开始截取6个字符的值为:,a3)print(截取字符串的第7到第10个字符的值为:,a4)

运行结果为:

原字符串:Python是当下最热门的编程语言截取字符串的第一个值为:P从字符串的第7个值开始截取的值为:是当下最热门的编程语言从字符串的左边开始截取6个字符的值为:Python截取字符串的第7到第10个字符的值为:是当下最

经典实例,通过输入身份证号码,输出:出生日期和生日。

假设小明的身份证号码为**********(隐藏重要信息),输出小明的出生日期和生日,代码如下:

sfz=**********csrq=sfz[6:10]+年+sfz[10:12]+月+sfz[12:14]+日sr=sfz[10:12]+月+sfz[12:14]+日print(小明的出生日期是:,csrq)print(小明的生日是:,sr)

运行结果为:

小明的出生日期是:年12月25日小明的生日是:12月25日

19.5:在Python中使用split()方法分割、使用join()方法合并字符串详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用split()方法分割、使用join()方法合并字符串详解》。本知识点主要内容有:在Python中使用split()方法分割字符串和在Python中使用join()方法合并字符串。

在Python中,字符串对象提供了分割和合并字符串的方法。分割字符串是把字符串分割为列表,而合并字符串是把列表合并为字符串,它们可以看作是互逆操作。下面分别进行介绍。

19.5.1.在Python中使用split()方法分割字符串

字符串对象的split()方法可以实现字符串分割。即把一个字符串按照指定的分隔符切分为字符串列表。该列表的元素中,不包括分隔符。split()方法的语法格式如下:

str.split(sep,maxsplit)

参数说明如下:

str:表示要进行分割的字符串。

sep:用于指定分隔符,可以包含多个字符,默认为None,即所有空字符(包括空格、换行“\n”、制表符“\t”等)。

maxsplit:可选参数,用于指定分割的次数,如果不指定或者为1,则分割次数没有限制,否则返回结果列表的元素个数最多为maxsplit+1。

返回值:分割后的字符串列表。

站长在线温馨提示:在split()方法中,如果不指定sep参数,那么也不能指定maxsplit参数。

例如,定义一个保存站长在线网址的字符串,然后应用split()方法根据不同的分隔符进行分割,代码如下:

a=站长在线

zhanzhangzaixiana1=a.split()#采用默认分隔符进行分隔a2=a.split(,)#采用,进行分隔a3=a.split(,,2)#采用,进行分隔,且只是分隔前2个a4=a.split(,2)#采用空格进行分隔,且只是分隔前2个print(a原字符串:,a)print(a1:,a1)print(a2:,a2)print(a3:,a3)print(a4:,a4)

运行结果如下:

a原字符串:站长在线

zhanzhangzaixiana1:[站,长,在,线,

,zhan,zhang,zai,xian]a2:[站长在线

zhanzhangzaixian]a3:[站长在线

zhanzhangzaixian]a4:[站,长,在线

zhanzhangzaixian]

结果分析:

在a1中,采用默认为空的分隔符进行分隔,显示时就会被系统默认的逗号“,”进行了分隔,是有效的。

在a2中,采用,进行分隔,是无效的

在a3中,采用,进行分隔,且只是分隔前2个,也是无效的。

在a4中,采用空格进行分隔,且只是分隔前2个,却是有效的。

这就说明了,使用split()方法如果不指定maxsplit参数的话,就使用默认为空的分隔符;要想指定maxsplit参数的话,sep的值,就只能使用空格了。

站长在线温馨提示:目前在返回的值中,Python仅支持默认的逗号“,”,看了很多的教程,居然sep可以指定,各种各样的分隔符,但是返回的值都是无效的,我也不知道其他的教程,这样写有什么意义。如下面的其他分隔符:

a=站长在线

zhanzhangzaixiana1=a.split()#采用默认分隔符进行分隔a2=a.split(,2)#采用空格进行分隔,且只是分隔前2个a3=a.split(,,2)#采用,进行分隔,且只是分隔前2个a4=a.split(.)#采用.进行分隔a5=a.split(*)#采用*进行分隔a6=a.split(~)#采用~进行分隔a7=a.split()#采用进行分隔a8=a.split()#采用进行分隔print(a原字符串:,a)print(a1:,a1)print(a2:,a2)print(a3:,a3)print(a4:,a4)print(a5:,a5)print(a6:,a6)print(a7:,a7)print(a8:,a8)

运行结果为:

a原字符串:站长在线

zhanzhangzaixiana1:[站,长,在,线,

,zhan,zhang,zai,xian]a2:[站,长,在线

zhanzhangzaixian]a3:[站长在线

zhanzhangzaixian]a4:[站长在线

zhanzhangzaixian]a5:[站长在线

zhanzhangzaixian]a6:[站长在线

zhanzhangzaixian]a7:[站长在线

zhanzhangzaixian]a8:[站长在线

zhanzhangzaixian]

所以站长在线认为:

使用split()方法如果不指定maxsplit参数的话,sep的值就使用默认为空的分隔符,显示结果会用逗号“,”分隔;sep的值使用其他字符串,都是无效的。

使用split()方法如果指定maxsplit参数的话,sep的值就只能使用空格了,显示结果会用逗号“,”分隔;sep的值使用其他字符串,都是无效的。

19.5.2、在Python中使用join()方法合并字符串

我在《在Python中使用“+”运算符来拼接字符串详解》中提到了使用join()方法来拼接字符串,但是没有深入的讲解,本知识点就来深入的进行讲解了。

其实,合并字符串与拼接字符串有所不同(当然也有相同的时候),它会将多个字符串采用固定的分隔符连接在一起。

join()方法也是非常重要的字符串方法,它是split()方法的逆方法,用来将列表(或元组)中包含的多个字符串连接成一个字符串。

合并字符串可以使用字符串对象的join()方法实现。其语法格式如下:

strnew=string.join(iterable)

其中,相关参数说明如下:

strnew:表示合并后生成的新字符串。

string:字符串类型,用于指定合并时的分隔符。

iterable:可迭代对象,该迭代对象中的所有元素(字符串表示)将被合并为一个新的字符串。string作为边界点分割出来。

例如,字符串“美琳*梦洁*雪丽*美莲”,就可以是通过分隔符“*”将[美琳,梦洁,雪丽,美莲]列表合并为一个字符串的结果。

b=[美琳,梦洁,雪丽,美莲]a=*.join(b)print(a)

运行结果为:

美琳*梦洁*雪丽*美莲

站长在线温馨提醒,使用join()方法合并字符串对象的时候,这个是可以使用任意分隔符的了,如:

b=[WWW,olzz,

分享 转发
TOP
发新话题 回复该主题