《Python程序设计案例教程第6章 字符串教学课件.pptx》由会员分享,可在线阅读,更多相关《Python程序设计案例教程第6章 字符串教学课件.pptx(67页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Python程序设计案例教程第6章字符串主 讲 人:X X X掌握Python字符串的基本操作。掌握Python字符串的常用函数。掌握Python字符串的格式化方法。能熟练使用Python提供的各类字符串函数完成常见的字符串处理任务。了解正则表达式的概念。能使用简单的正则表达式完成较复杂的字符串处理任务。01字符串字符串字符串字符串是Python中最常用的数据类型。要掌握字符串的操作,最好的方式是理解字符串在Python中是如何使用的,并且了解Python中关于字符串的一些细节知识,知道有哪些定义方式、有哪些字符串类型、字符串对象的基本操作有哪些。字符串定义我们在第二章中简单的介绍了,如何在P
2、ython中使用字符串。知道在Python中可以使用引号(、或)来创建字符串。代码展示:Str1=单引号字符串#使用单引号创建字符串Str2=双引号字符串#使用双引号创建字符串Str3=三引号字符串#使用三引号创建字符串,也可以使用三个单引号Str4=你创造了一个字符串,你就不能再改变它了。当我们为字符串赋值的时候,实际上是让变量指向新创建的一个字符串。见下图示:代码展示:print(LetsstartwithPython)print(他在说:Hi!)运行结果:SyntaxError:invalidsyntaxSyntaxError:invalidsyntax在上述代码中,第一个字符串包含一个
3、单引号,因此不能用单引号将整个字符串括起。Python会认为字符串是Let,而后边的内容“sstartwithPython”由于不符合Python的语法规则,因此Python不知道如何处理后面的部分,只能抛出一个语法错误异常。第二个字符串包含双引号,原因和前面一样。Python也不知道如何处理,只能抛出语法错误异常。一种方便的解决方式就是如果在字符串中需要使用某种引号的时候,字符串的界定符就使用另一种符号。print(LetsstartwithPython)print(他在说:Hi!)print(她在说:LetsstartwithPython!)#注意这里界定符使用的是三引号实际上,这样做只是
4、出于方便考虑,并非必须这样做。更为通用的方式是使用反斜杠()对引号进行转义。在Python中字符串有非常多的类型,现在我们看到的只是字符串中使用最多的一种类型。此外,还有原始字符串、字节字符串、unicode编码字符串等类型。现在我们需要显示一个window下的文件路径代码展示:Str1=C:toolsnotebooktoolspython.exeprint(Str1)#输出字符串运行结果:C:oolsotebooktoolspython.exe显示的结果和我们的期望有出入,这是因为反斜杠()和后边的字符组成了新的转义字符。如下图示:这些转义可能是有意义的,也有可能是无意义的。那么如何控制什么
5、时候转义,什么时候不转义?当我们不希望进行转义时,可以在反斜杠()的前边再加一个反斜杠(),形成双反斜杠(),双反斜杠的作用就是将反斜杠()转义为反斜杠(),这样就能变相的控制转义字符。正确的显示window下的文件路径代码展示:Str1=C:toolsnotebooktoolspython.exeprint(Str1)#输出字符串运行结果:C:toolsnotebooktoolspython.exe在python中,字符串支持很多不同的转义字符,具体见下表。转义字符描述在行尾时为续行符反斜杠符号,在字符串中需要使用到反斜杠()时,需要在反斜杠前边再加一个反斜杠。这是因为反斜杠会和后边的符号结
6、合为转义符,为了使用反斜杠自身,我们需要在反斜杠前边再多加一个反斜杠。单引号,如果使用单引号来定义字符串,但是又需要在字符串使用单引号,这时就需要对单引号进行转义。双引号,同上。转义字符描述b退格(Backspace)a响铃n换行v纵向制表符t横向制表符r回车如果我们的字符串中需要很多的反斜杠(),如果还使用双反斜杠()的方式,那么不管是写起来,还是看起来都会比较麻烦。如果考虑到未来对代码的维护,显然双反斜杠()就不是一个好的选择。幸运的是,Python中提供了一种便捷的解决方式,使用原始字符串。所谓原始字符串就是不以特殊方式处理反斜杠。因此在需要反斜杠()的那些情况下就很有用。它的用法也非常
7、简单,就是定义字符串的引号前加字母r,大小写均可。使用原始字符串显示window下的文件路径代码展示:Str1=rC:toolsnotebooktoolspython.exeprint(Str1)#输出字符串Python中有普通字符串、原始字符串,此外还有字节字符串,字节字符串一般作为字节流使用,主要出现在需要将数据转换为二进制流的时候使用,如将数据保存为二进制文件、网络传输二进制数据等情况。普通字符串和字节字符串之间可以相互转换。定义字节字符串时只需要在字符串的第一个引号前边添加字母b,大小写均可。代码展示:Str1=b0 x00 x10 x20 x3print(Str1)#输出字符串运行结
8、果:bx00 x0 x00 x1x00 x2x00 x3在python中字节字符串与普通字符串有如下几点不同:1.字节字符串中数值0是作为有效数据,但是在普通字符串数值0(也就是0)表示字符串的结尾,并不作为字符串的一部分;2.字节字符串中数据是以字节(8位二进制)为单位,取值范围为0255;3.普通字符串是以字符为单位,每个字符占(1 至 4)个字节,数字和英文字母占一个字节,汉字占3至4个字节;虽然字节字符串与普通字符串有所不同,但是他们之间也是可以相互转换的。在相互转换过程中要注意,字符串的编码始终是utf-8格式,当将字符串转换为字节串的时候,可以指定转换后的编码格式,如:utf-8、
9、utf-16、utf-32、ascii、gb2312、gb18030等。同样的,当从字节串向字符串转换的时候,要考虑当前字节串中数据的编码格式。字符串转换到字节串,因为字符串始终是“utf-8”编码,但是字节串有不同编码,所以是一个编码过程,使用字符串对象的编码(encode)方法。这个方法需要指定编码格式,指明转换为字节串后的编码格式:字符串对象.encode(编码格式)字节串转换到字符串,字节串有不同编码,字符串始终是“utf-8”编码,所以是一个解码过程,使用字节串对象的解码(decode)方法。这个方法需要指定解码格式,指出转换到字符串前,字节串自身的编码格式:字节串对象.decode
10、(解码格式)这个过程可以参考下图:字符串转换为字节串代码展示:strVar=中文utf8bytesVar=strVar.encode(utf-8)utf16bytesVar=strVar.encode(utf-16)utf32bytesVar=strVar.encode(utf-32)gb2312bytesVar=strVar.encode(gb2312)字符串转换为字节串代码展示:strVar=中文print(中文两字的utf-8编码:,utf8bytesVar)print(中文两字的utf-16编码:,utf16bytesVar)print(中文两字的utf-32编码:,utf32byte
11、sVar)print(中文两字的gb2312编码:,gb2312bytesVar)字节串转换为字符串代码展示:print(解码后文字为:,utf8bytesVar.decode(utf-8)print(解码后文字为:,utf16bytesVar.decode(utf-16)print(解码后文字为:,utf32bytesVar.decode(utf-32)print(解码后文字为:,gb2312bytesVar.decode(gb2312)在字符串和字节串之间相互转时一定要注意编码格式一定要匹配。比如,把字符串编码为“gb2312”格式,解码时也要使用“gb2312”,只有这样才能正确解码。如
12、果编解码时使用的字符编码格式不同,可能就会出现乱码或在错误。字节串转换为字符串代码展示:strVar=中文gb2312bytesVar=strVar.encode(gb2312)#编码为gb2312格式print(解码后文字为:,gb2312bytesVar.decode(utf-16)#解码使用utf-16格式索引和切片通过字符串的定义,可以知道字符串是由一系列字符组成的有序集合。实际上字符串在Python中也是一种序列,它也支持索引和切片操作。因此在使用中,我们除了能将字符串作为整体使用,也可以单独的访问它其中的一部分内容。与前边学习的列表、元组类似。字符串的所有元素都有编号从0开始递增。
13、如字符串“Hello”,其中字母“H”的编号为0,字母“e”的编号为1,以此类推。见下图示:如果需要访问字符串中的元素,可以使用索引操作符()进行操作。你可像下面这样使用编号来访问各个元素:使用字符串索引代码展示:strVar=Helloprint(第0个字符是:,strVar0)print(第1个字符是:,strVar1)一般来说,如果序列中元素的数量是n,序列索引的下标是从0开始,到序列中元素数量减一为止(n-1),这些下标能顺序的索引序列中的元素。不过,Python中为开发者提供了另外的方式,可以后向索引序列中的元素。这极大的方便了开发者,因为反方向访问序列也是在实际开发工作中常见的操作
14、。字符串作为一种序列,当然也是可以进行后向索引。后向索引时,第一个元素的下标是-n,最后一个元素的下标是-1,整体范围为-n,-1。见下图示:字符串能进行索引操作,当然也可以进行切片。使用方式和列表和元组中的切片方式一样,在切片操作符(:)中,提供起始下标、结束下标、以及位移量。使用方式如下:字符串变量 始下标:结束下标:位移量 始下标:切片起始位置,结果中会包含起始下标指定的字符。结束下标:切片结束位置,结果中会不会包含结束下标指定的字符。位移量:切片过程中,每次取值位置之间的间隔。正数时,表示正向偏移。负数时为反向偏移。位移量为正向1的时候,可以省略。使用字符串切片操作代码展示:strVa
15、r=Helloprint(正向切片1:4:2结果为:,strVar1:4:2)print(反向切片-1:-1结果为:,strVar-1:-1)运行结果:正向切片1:4:2结果为:el反向切片-1:-1结果为:olleH始下标和结束下标如果表示字符串的第一个字符,或在最后一个字符时,可以省略。后向的情况也是一样的。始下标和结束下标使用的索引可以不同,就是说起始下标可以是正向的,而结束下标可以是后向的。限制条件就是,在正向切片时,起始位置一定在结束位置的左边;后向切片时,起始位置在结束位置的右边。见下图示:字符串运算符所有标准序列操作如加法、乘法、成员资格检查等都适用于字符串,但字符串是不可变的,
16、因此所有的元素赋值和切片赋值都是非法的。操作符操作符描述描述+字符串连接*字符串倍增in成员运算符not in成员运算符使用加法操作符可以连接两个字符串,但是参与运算的两个操作数必须都是字符串类型。操作的结果是一个新的字符串。我们看一个例子:当乘法运算符作用于字符串时,是字符串倍增操作。倍增操作是将字符串重复指定次数。左操作数为字符串,右操作数为一个整数,用法如下:字符串对象*重复次数代码展示:print(-*20)print(Hello+World)print(-*20)运行结果:-HelloWorld-字符串的成员运算符(in、notin)是用于判断字符子串,是否存在于指定的字符串中。结果
17、是布尔类型,根据具体情况结果是真(True),或假(False)。字符串成员运算操作。代码展示:print(字符H是否在单词Hello中:,HinHello)print(字符A是否在单词Hello中:,HnotinHello)运行结果:字符H是否在单词Hello中:True字符A是否在单词Hello中:False02常用操作Python为字符串提供了丰富的操作运算符,同时也为字符串操作提供了大量的内建函数和方法。这些内建函数和方法,向开发者提供了常见的字符串操作功能,如子串查找、大小写转换、格式化等操作。常用函数字符串常用函数包括取长度、最大值、最小值等。其中取得字符串长度函数,是在开发中使用
18、较多的函数。函数函数功能功能实例实例len(str)取得字符串长度。len(hello)结果为5max(str)取得字符串中编码值最大的字符。max(hello)结果为omin(str)取得字符串中编码值最小的字符。min(hello)结果为e字符串对象自身提供了丰富的方法。这些方法提供了大小写转换、统计子串、判断字符串类型、格式化等功能。str.capitalize()str.ljust(width,fillchar)str.isalpha()str.splitlines(keepends)str.casefold()str.lower()str.isascii()str.startswit
19、h(prefix,start,end)str.center(width,fillchar=)str.lstrip(chars)str.isdecimal()str.strip(chars)str.count(sub,start,end)str.partition(sep)str.isdigit()str.swapcase()str.encode(encoding=utf-8,errors=strict)str.replace(old,new,count)str.isidentifier()str.title()str.endswith(suffix,start,end)str.rfind(su
20、b,start,end)str.islower()str.translate(table)str.expandtabs(tabsize=8)str.rindex(sub,start,end)str.isnumeric()staticstr.maketrans(x,y,z)str.find(sub,start,end)str.rjust(width,fillchar)str.isprintable()str.upper()str.format(*args,*kwargs)str.rpartition(sep)str.isspace()str.zfill(width)str.format_map(
21、mapping)str.rsplit(sep=None,maxsplit=-1)str.istitle()str.join(iterable)str.index(sub,start,end)str.rstrip(chars)str.isupper()str.split(sep=None,maxsplit=-1)str.isalnum()split方法拆分字符串。代码展示:strInfo=python,历史悠久,是一门通用语言strList=strInfo.split(,)foriteminstrList:print(item)字符串拆分是非常常用的操作。是通过指定一个分割字符串来拆分字符串,过
22、程如下图示:使用translate函数实现凯撒密码加/解密字符串字符串格式化将值转换为字符串并设置其格式是一个重要的操作,需要考虑众多不同的需求,Python提供了多种字符串格式设置方法。以前,主要的解决方案是使用字符串格式设置运算符百分号(%)。这个运算符的行为类似于C语言中的字符串格式化方法。除了传统类似于C语言的方式,python还提供了其他两种更为方便和强大的格式化方法。printf风格的字符串格式化方法,提供类似C语言字符串格式化方法。其格式化参数与C语言字符串格式化方式基本兼容,不过Python也在此基础上进行了改进。其用法如下:格式化字符串%参数值格式化字符串:是含有格式化参数的
23、字符串参数值:为格式化参数提供实际值的单独值、或者元组对象,根据格式化字符串中格式化参数的数量而定。字符串格式化操作。代码展示:print(%ssay:Hello%python)print(%s今年%d岁了%(python,29)这里展示的是C风格格式化方法,其中参数值的提供方式是在字符串后边使用%运算符提供的。当时格式化字符串格式化参数只有一个时,百分号后边可以直接提供对应的值。当格式化字符串中包含多于一个的格式化参数时,百分号后边的值以元组的形式给出,并且元组中元素数量要和字符串中格式化参数的数量一致。元组中的值按照循序赋值为格式化字符串中的格式化参数。python中格式化字符串一个非常方
24、便的方式就是映射键。在C语言中格式字符串一个缺点,是参数和对应的值必须严格一一对应。当格式字符串中的格式化参数比较多的时候,书写和调试起来比较麻烦。因此,python提供了这个可选的映射键字段。为字符串格式化参数与值提供灵活的对应关系。字符串格式化操作中映射键的使用。代码展示:valueMapping=name:python,age:29print(%(name)s今年%(age)d岁了%(valueMapping)除了使用传统的百分号(%)方式进行字符串格式化,Python还提供了使用format方法的格式化方法。format方法的使用方式如下:格式化字符串.format(参数列表)这里需要
25、注意,格式化字符串中的格式化参数书写格式发生了改变,主要是通过和:来代替以前的百分号(%)。书写方式如下:映射键|索引位置:填充字符对齐方式正负号#0宽度精度类型 使用字符串的format方法进行字符串格式化操作。代码展示:print(say:.format(python,Hello)print(1say:0.format(Hello,Tom)print(namesay:word!Imname.format(word=Hi,name=Jack)在3.6版本以后提供了“格式化字符串字面值”功能,或称f-string是带有f或F前缀的字符串字面值。用法如下:f格式化字符串这种字符串可包含格式化参数
26、,即以标示的表达式。而其他字符串字面值总是一个常量,格式化字符串字面值实际上是会在运行时被求值的表达式。也就是说在运行时,python会先将中的表达式求值,然后按照参数给定的方式进行格式化。其中的格式化参数写法和format函数中的写法一致。只是中的映射键必须是当前可用的变量名或者合法的Python表达式。使用f-sting格式化。代码展示:importmathprint(f值是:math.pi:.5f)r=1area=math.pi*(r*2)print(f半径r:.1f米的圆,面积为:area:.3f平方米)03正 则 表 达 式在字符串处理中,很多功能靠字符串自身的方法很难实现,或者实现
27、起来很复杂。比如,我们要在一段包含人员信息的文本中找到所有的电子邮箱地址、手机号码或者日期等信息,实现这个功能单靠字符串自身提供的方法就比较麻烦。此时,我们需要借助一个功能更为强大的字符串处理工具,也就是正则表达式。正则表达式,又称规则表达式。正则表达式主要用于文本模式的描述。换句话说,正则表达式代码是一个规则,表示符合这个规则的所有字符串。我们看一个例子,在字符串中找到所有的电子邮箱地址。使用正则式找QQ号码。importreinfo=zhengyi_59196144xiao_qi_126375861101893768995222860926013261655430sun_min_48949
28、3652print(QQ号码有:,re.findall(rb1-9d4,9b,info)基本符号要运用正则表达式,需要按照一定的规则来书写表达式。正则表达式中提供了一系列的基本符号(也被称为元字符),用于表示一个特定字符或者一类字符中的一个。元字符以外的称为原义字符,也就是文本中正常的文本字符。当我们在正则表达式使用原义字符,相当于字符串的查找。我们来看一个例子:使用原义字符。代码展示:importreinfo=zhengyi_59196144xiao_qi_126375861101893768995222860926013261655430sun_min_489493652print(查找结
29、果:,re.findall(ralimail,info)这个例子使用原义字符,相当于在文本中查找指定的字符串。要发挥正则表达式强大的模式匹配能力,还需要配合使用元字符。元字符元字符说明说明实例实例.匹配除换行符以外的任意字符。.去匹配python结果为:p,y,t,h,o,nw匹配字母或数字或下划线或汉字。w去匹配python结果为:p,y,t,h,o,ns匹配任意的空白符。shellopython结果为:(空格)d匹配数字。d去匹配XiaoQiX结果为:1,6,3b匹配单词的开始或结束。并不是具体的字符,表示一个单词开始或者结束的位置。b去匹配Hellopython结果为:,匹配字符串的开始
30、。并不是具体的字符,表示字符串开始位置。去匹配Hellopython结果为:元字符元字符说明说明实例实例$匹配字符串的结束。并不是具体的字符,表示字符串开始位置。$去匹配Hellopython结果为:W匹配任意不是字母,数字,下划线,汉字的字符。W去匹配Python:hi!结果为::,!,S匹配任意不是空白符的字符S去匹配SayHi结果为:S,a,y,H,i,D匹配任意非数字的字符D去匹配123xyz结果为:x,y,zB匹配不是单词开头或结束的位置B去匹配Hithere结果为:,只使用原义字符或者元字符还只能写出比较简单的规则,比如我们希望匹配文本中所有的英文单词,光靠原义字符和元字符就不行。
31、因为,英文单词的长度并不固定。要匹配这种可变长度且由相同类型的字符组成的文本时,就需要用到正则表达式的次数限定符。限定符用来设置一个模式重复的次数。正则表达式中的限定符如下表:限定符限定符说明说明实例实例*重复零次或更多次w*匹配Hithere“结果为:Hi,there,+重复一次或更多次w+匹配Hithere“结果为:Hi,there?重复零次或一次w?匹配Hithere“结果为:H,i,t,h,e,r,e,n重复n次w2匹配Hithere“结果为:Hi,th,ern,重复n次或更多次w2,匹配Hithere“结果为:Hi,theren,m重复n到m次w2,5匹配Hithere“结果为:Hi
32、,there有的时候我们查找的信息本身没有规律可言,但是这些信息的前后可能有一定的规律,比如网页中的信息。我们在处理网页信息时,可以通过标签找到需要的信息,但是并需要标签本身。在正则式中可以使用零宽断言来完成这样的工作。零宽断言的用法如下:语法语法说明说明(?=exp)匹配exp前面的位置(?=exp)匹配exp后面的位置(?!exp)匹配后面跟的不是exp的位置(?!exp)匹配前面不是exp的位置re模块Python为支持正则表达式匹配操作,提供了re模块。在前边的内容中我们已经使用其中的部分内容。模块定义了几个函数、常量。函数函数说明说明match(pattern,string,flag
33、s=0)尝试从字符串(string)的起始位置匹配正则表达(pattern),如果不是起始位置匹配成功的话,match()就返回none。如果成功返回一个Match对象。fullmatch(pattern,string,flags=0)尝试整个字符串(string)去匹配正则表达(pattern),如果匹配失败的话,fullmatch()就返回none。如果成功返回一个Match对象。search(pattern,string,flags=0)扫描整个字符串并返回第一个成功的匹配。如果成功返回Match对象。失败返回None。sub(pattern,repl,string,count=0,flags=0)将字符串(string)中满足正则表达(pattern)的子串用repl的的结果进行替换,并返回替换后的新字符串作为结果。repl可以是字符串或函数。count参数表示将匹配到的内容进行替换的次数。subn(pattern,repl,string,count=0,flags=0)执行与相同的操作sub(),但返回一个元组。元组内容为(新字符串,替换的次数)。掌握Python字符串的基本操作掌握Python字符串的常用函数掌握Python字符串的格式化方法能熟使用Python提供各类字符串函数完成常见字符串处理任务了解正则表达式的概念能使用简单的正则表达式完成较复杂的字符串处理任务