资源简介 单元4 序列数据与正则表达式操作课程名称 Python程序设计任务驱动式教程 章名 序列数据与正则表达式操作教学内容 序列数据与正则表达式操作 课时项目性质 □演示性 □验证性 □设计性 √综合性授课班级 授课日期 授课地点教学目标 了解Python序列、Python成员运算符等基础知识 掌握列表的创建与应用 掌握元组的创建与应用 掌握字典的创建与应用 掌握集合的创建与应用 掌握字符串的常用方法及其应用 掌握字符串的格式化输出 熟悉正则表达式及其应用 掌握使用re模块实现正则表达式操作的方法教学内容 列表的创建与应用 元组的创建与应用 字典的创建与应用 集合的创建与应用 字符串的常用方法及其应用 字符串的格式化输出 正则表达式及其应用 使用re模块实现正则表达式操作教学重点 列表、元组、字典、集合的创建与应用,字符串的常用方法及其应用,使用re模块实现正则表达式操作教学难点 列表、元组、字典、集合的创建与应用,字符串的常用方法及其应用,使用re模块实现正则表达式操作教学准备 装有Python的计算机 教学课件PPT 教材:《Python程序设计任务驱动式教程(微课版)》作业设计39教学过程教学环节 教学内容与过程 (教学内容、教学方法、组织形式、教学手段)课前组织 做好上课前的各项准备工作(打开计算机、打开课件、打开软件、打开授课计划、教案等),吸引学生注意力。课程说明 【课前说明】 分别从Python序列、Python成员运算符等知识点进行初步的了解。 【目的】 使学生从了解本节课的学习目标、学习重点、考评方式等方面明确课程学习的要求和目标。课程内容描述 4.1 列表的创建与应用 列表(list)是一种可变序列,是Python中使用最频繁的数据类型之一。 4.1.1 创建列表 Python中的列表是由一系列按特定顺序排列的元素组成,列表元素写在方括号“[]”内、两个相邻元素使用逗号“,”分隔。列表中元素的类型可以不相同,因为各个列表元素之间没有相关关系,列表支持数字、字符串,甚至可以包含列表(列表嵌套)。 1.使用赋值运算符直接创建列表 可以使用赋值运算符“=”直接将一个列表赋值给变量,其基本语法格式如下。 变量名称=[元素1,元素2,元素3,…,元素n] 列表元素的数据类型和元素个数都没有限制,只要是Python支持的数据类型都可以,但为了提高程序的可读性,一般情况下,列表中各个元素的数据类型是相同的。 例如: >>>x = ['a', 'b', 'c'] >>>n = [1, 2, 3] 2.创建空列表 在Python中,可以创建空列表,其基本语法格式如下。 变量名=[] 3.使用list()函数创建数值列表 在Python中,可以使用list()函数创建数值列表,其基本语法格式如下。 list(data) 其中,data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。 可以直接使用range()函数创建数值列表,例如: >>>list(range(5,15,2)) 运行结果如下。 [5, 7, 9, 11, 13] 4.创建嵌套列表 在Python中还可以使用嵌套列表,即在列表里创建其他列表,例如: >>>x = ['a', 'b', 'c'] >>>n = [1, 2, 3] >>>list = [x, n] >>>list 运行结果如下。 [['a', 'b', 'c'], [1, 2, 3]] >>>list[0] 运行结果如下。 ['a', 'b', 'c'] >>>list[0][1] 运行结果如下。 'b' 4.1.2 访问列表元素 列表中的每一个元素都有一个编号,也称为索引。该索引从左至右的编号从0开始递增,即索引为0表示第1个元素,索引为1表示第2个元素,以此类推。列表的索引也可以从右至左进行编号,并且编号使用负数,最后一个元素的索引为-1,倒数第2个元素的索引为-2,以此类推,列表和索引如图所示。 元素元素1元素2元素3元素4……元素n-1元素n正索引0123……n-2n-1负索引-n-(n-1)-(n-2)-(n-3)……-2-1列表和索引 使用索引可以访问列表中的任何元素,访问列表元素的基本格式如下。 列表[索引] 对于列表list=['a', 'b', 'c', 'd', 'e'],访问列表元素的各种形式如表所示。 访问列表元素的各种形式 序号基本语法格式说明实例1列表名返回列表所有元素list2列表名[i]返回列表中索引为i的元素,即第i+1个元素list[0]、list[1]、list[2]3列表名[-i]返回列表中从右开始往左的第i个元素list[-1]、list[-2]【实例4-1】演示多种形式访问列表中的值 实例4-1的代码如下所示。 fieldName=["商品ID","图书名称","价格","商品编码","出版社"] print("输出列表fieldName所有元素:",fieldName) print("逐个输出列表fieldName的前3个元素:",fieldName[0],fieldName[1],fieldName[2]) print("逐个输出列表fieldName的后2个元素:",fieldName[-2],fieldName[-1]) 实例4-1中的fieldName[0],fieldName[1],fieldName[2]分别表示从列表的左侧开始读取第1、2、3个元素,fieldName[-2],fieldName[-1]分别表示从列表的右侧开始读取倒数第2、1个元素。 实例4-1的运行结果如下。 输出列表fieldName所有元素: ['商品ID', '图书名称', '价格', '商品编码', '出版社'] 逐个输出列表fieldName的前3个元素: 商品ID 图书名称 价格 逐个输出列表fieldName的后2个元素: 商品编码 出版社 从运行结果可以看出,使用列表名称输出列表所有元素时,结果中包括方括号“[]”;通过列表的索引输出指定的列表元素时,结果中不包括方括号“[]”,如果是字符串,也不包括左右的引号。 4.1.3 截取列表 截取操作是访问列表元素的一种方法,它可以访问一定范围内的多个元素,列表被截取后返回一个包含所需元素的新列表。 对于列表list=['a', 'b', 'c', 'd', 'e'],截取列表元素的各种形式如表所示。 截取列表元素的各种形式 序号基本语法格式说明实例1列表名[i:j]截取列表中索引值为i至j的元素list[1:3]2列表名[i:]截取列表中索引值为i的元素至最后1个的所有元素list[2:]3列表名[:j]截取列表中第1个元素至索引值为j-1的所有元素list[:3]4列表名[:]截取列表中所有元素list[:]5列表名[i:j:k]从列表中第i个元素开始,每隔k个截取1个列表中的元素,直至列表第j-1个元素为止list[1:3:2]对于列表list=['a', 'b', 'c', 'd', 'e'],从左向右的索引值分别为0、1、2、3、4,从右向左的索引值分别为-1、-2、-3、-4、-5。 list[1:3]表示从列表list左侧开始读取第2、3个元素,其返回值为['b', 'c'];list[:4]表示从列表list左侧开始读取第1个至第4个的所有元素,其返回值为['a', 'b', 'c', 'd'];list[3:]表示从列表list的第3个元素开始往后的所有元素,其返回值为['d', 'e'];list[:]表示从列表list读取所有元素,其返回值为['a', 'b', 'c', 'd', 'e'],与t[:5]的返回值相同,即返回一个包含所有元素的新列表。 列表list的截取示意如图所示。 列表list的截取示意 【实例4-2】演示多种形式列表的截取 实例4-2的代码如下所示。 bookData=["1","HTML5+CSS3移动Web开发实战","58.00","50676377587" ,"人民邮电出版社"] print("输出列表bookData所有元素1:",bookData) print("输出列表bookData所有元素2:",bookData[:]) print("输出列表bookData第2至第3个元素:",bookData[1:3]) print("输出列表bookData第2个与第5个元素:",bookData[1:5:3]) 实例4-2的运行结果如图所示。 实例4-2的运行结果 4.1.4 连接与重复列表 列表支持连接与重复操作,加号“+”是列表连接运算符,星号“*”是列表重复操作符。 将列表list1的元素增加到列表list中的基本语法格式如下。 list+=list1 也可以使用extend()来实现,基本语法格式如下。 list.extend(list1) 将list列表的元素重复n次的基本语法格式如下。 list*=n 其含义是将原列表重复n次生成一个新列表。 【实例4-3】演示列表的连接与重复操作 实例4-3的代码如下所示。 publisher=["人民邮电出版社"] bookData1=["2","给Python点颜色 青少年学编程"] bookData2=["59.80","54792975925","人民邮电出版社"] print("输出重复2次的列表:",publisher*2) print("输出两个列表的连接结果:",bookData1+bookData2) 实例4-3的运行结果如下。 输出重复2次的列表: ['人民邮电出版社', '人民邮电出版社'] 输出两个列表的连接结果: ['2', '给Python点颜色 青少年学编程', '59.80', '54792975925', '人民邮电出版社'] 4.1.5 修改与添加列表元素 可以对列表的数据项进行修改或添加,列表中的元素是可以改变的。 1.修改列表元素 修改列表中的元素只需要通过索引找到该元素,然后为其重新赋值即可。 修改列表元素的基本语法格式如下。 list[i]=x 即替换列表list中索引值为i的元素值为x。 例如: >>>list = [1, 2, 3, 4, 5, 6] >>>list [0] = 9 #修改列表元素值 >>>list [2:5] = [13, 14, 15] #修改列表元素值 >>>list 运行结果如下。 [9, 2, 13, 14, 15, 6] 也可以修改指定区间的列表元素值,用列表list1替换列表list中第i至j项数据的基本语法格式如下。 list[i:j]=list1 例如: >>>letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>>list1=['B', 'C', 'D'] >>>letters[1:3] =list1 #替换一些元素值 >>>letters 运行结果如下。 ['a', 'B', 'C', 'D', 'd', 'e', 'f', 'g'] 2.在列表末尾添加元素 可以通过使用append()方法在列表的末尾添加新元素,在list列表的末尾添加元素x的基本语法格式如下。 list.append(x) 例如: >>>list = [1, 2, 3, 4, 5, 6] >>>list.append(7) #在list列表中添加新元素 >>>list 运行结果如下。 [1, 2, 3, 4, 5, 6, 7] 4.1.6 删除列表元素 1.给列表元素赋空值 在Python中,列表中的元素是可以删除的。 例如: >>>list = [1, 2, 3, 4, 5, 6] >>>list[2:5] = [] #删除列表中第3个至第5个元素 >>>list 运行结果如下。 [1, 2, 6] >>>list[:] = [] #清除列表 >>>list 运行结果如下。 [] 2.使用del语句删除列表元素 在Python中,可以使用del语句删除列表中的元素,删除列表list中第i至第j项以k为步长的元素的基本语法格式如下。 del list[i:j:k] 例如: >>>list = [1, 2, 3, 4, 5, 6] >>>del list[2] >>>print ("删除列表中第3个元素后的列表:",list) >>>list 运行结果如下。 删除列表中第3个元素后的列表:[1, 2, 4, 5, 6] 从输出结果可以看出,第3个元素“3”被删除了。 >>>letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>>del letters[2:7:2] >>>print ("删除列表中第3至第7项以2为步长的元素后的列表:", letters) 运行结果如下。 删除列表中第3至第7项以2为步长的元素后的列表: ['a', 'b', 'd', 'f'] 从输出结果可以看出,第3、5、7个元素“c”“e”“g”被删除了。 4.1.7 列表运算符 列表的运算符如表所示。 列表的运算符 序号Python表达式运算结果说明1[1, 2, 3] + [4, 5, 6][1, 2, 3, 4, 5, 6]组合2['go!'] * 3['go!', 'go!', 'go!']重复33 in [1, 2, 3]True元素是否存在于列表中4for x in [1, 2, 3]: print(x, end=" ")1 2 3迭代Python中列表的成员运算符有in和not in,in用于检查指定元素是否是列表成员,即检查列表中是否包含了指定元素。基本语法格式如下。 元素 in 列表 例如: >>>list=[1,2,3,4] >>>3 in list 运行结果如下。 True 如果在列表中存在指定元素,则返回值为True,否则返回值为False。 在Python中,也可以使用not in检查指定元素是否不包含在指定的列表中。基本语法格式如下。 元素 not in 列表 例如: >>>list=[1,2,3,4] >>>5 not in list 运行结果如下。 True 4.1.8 列表的内置函数与基本方法 1.Python列表的内置函数 Python列表的内置函数如表所示。 Python列表的内置函数 序号函数说明1len(list)返回列表list元素的个数,即列表的长度2max(list)返回列表list元素的最大值3min(list)返回列表list元素的最小值4sum(list[,start])返回列表list元素的和,其中start用于指定统计结果的开始位置,是可选参数,如果没有指定,默认值为05sorted(list, key=None ,reverse=False)对列表list元素进行排序,并且使用该函数进行排序会建立一个原列表的副本,该副本为排序后的列表,原列表的元素顺序不会改变。其中,key用于指定排序规则;reverse为可选参数,如果将其值指定为True,则表示降序排列,如果为False,则表示升序排列,默认为升序排列6reversed(list)反向排列列表list中的元素7str(list)将列表list转换为字符串8list(seq)将元组seq转换为列表9enumerate(list)将列表list组合为索引列表,多用于for循环语句中【实例4-4】演示Python列表的内置函数的应用 实例4-4的代码如电子活页4-1所示。 实例4-4的运行结果如图所示。 实例4-4的运行结果 2.Python列表的基本方法 Python列表的基本方法如表所示。 Python列表的基本方法 序号方法说明1list.append(x)在列表list末尾添加新的元素x2list.extend(seq)在列表list末尾一次性追加另一个序列中的多个元素(用新列表扩展原来的列表)3list.insert(i,x)在列表list的第i项位置插入新元素x4list.copy()复制列表list生成新的列表5list.pop([index=-1])移除列表list中的一个元素(默认为最后一个元素),且返回该元素的值list.pop(i)将列表list中的第i项元素删除6list.remove(x)移除列表list中x元素值的第一个匹配项7list.clear()清空列表list,即删除列表list中的所有元素8list.reverse()反向列表list中的元素9list.sort(key=None ,reverse=False)对原列表list进行排序,并且使用该方法进行排序会改变原列表的元素排列顺序。其中key表示指定一个从每个列表元素中提取一个用于比较的键;reverse为可选参数,如果将其值指定为True,则表示降序排列,如果为False,则表示升序排列,默认为升序排列10list.index(x)从列表list中找出指定元素值首次匹配项的索引值11list.count(x)统计指定元素在列表list中出现的次数【实例4-5】演示Python列表的基本方法和成员运行符的应用 实例4-5的代码如电子活页4-2所示。 实例4-5的运行结果如图所示。 实例4-5的运行结果 【任务4-1】遍历列表 【任务描述】 (1)在PyCharm集成开发环境中创建项目Unit04。 (2)在项目Unit04中创建Python程序文件4-1.py。 (3)使用for循环语句遍历列表,输出列表所有元素的值。 (4)使用for循环语句结合enumerate()函数遍历列表,输出列表所有元素的索引值和元素值。 【任务实施】 1.创建PyCharm项目Unit04 成功启动PyCharm后,在指定位置“D:\PycharmProject\”创建PyCharm项目Unit04。 2.创建Python程序文件4-1.py 在PyCharm项目Unit04中新建Python程序文件4-1.py,同时PyCharm主窗口显示程序文件4-1.py的代码编辑窗口,在该程序文件的代码编辑窗口自动添加了模板内容。 3.编写Python程序代码 在新建文件4-1.py的代码编辑窗口已有模板注释内容下面输入程序代码,程序文件4-1.py的代码如电子活页4-3所示。 单击工具栏中的【保存】按钮,保存程序文件4-1.py。 4.运行Python程序 在PyCharm主窗口选择【Run】菜单,在弹出的下拉菜单中选择【Run】。在弹出的【Run】对话框中选择“4-1”选项,程序文件4-1.py开始运行。 程序文件4-1.py的运行结果如下。 遍历输出列表bookData所有元素值: 1 HTML5+CSS3移动Web开发实战 58.00 50676377587 人民邮电出版社 遍历输出列表bookData所有元素的索引值和元素值: 1 1 2 HTML5+CSS3移动Web开发实战 3 58.00 4 50676377587 5 人民邮电出版社 4.2 元组的创建与应用 Python中的元组(tuple)与列表类似,也是由一系列按特定顺序排列的元素组成,不同之处在于元组一旦创建其元素不能修改,所以又称为不可变的列表。 4.2.1 创建元组 1.使用赋值运算符创建元组 创建元组很简单,只需要将元组的所有元素放在圆括号“()”中,两个相邻元素之间用逗号“,”隔开。 创建元组时,可以使用赋值运算符“=”直接将一个元组赋值给变量,基本语法格式如下。 变量名=(元素1,元素2,元素3,…,元素n) 可以将整数、浮点数、字符串、列表、元组等Python支持的任何类型的内容作为元素值放入元组中,并且在同一个元组中元素的类型也可以不同,因为元组的元素之间没有相关关系。元组中元素的个数没有限制。 例如: >>>tuple1 = (1, 2, 3, 4, 5 ) >>>tuple1 >>>tuple2 = "a", "b", "c", "d" #不使用括号也可以,圆括号并不是必需的 >>>tuple2 运行结果如下。 (1, 2, 3, 4, 5) ('a', 'b', 'c', 'd') >>>type(tuple2) 运行结果如下。 2.创建空元组 在Python中,也可以创建空元组,创建空元组(包含0个元素的元组)的基本语法格式如下。 tuple = () #空元组 空元组可以应用在为函数传递一个空值或者返回空值的情况。 3.创建只包含1个元素的元组 创建包含0个或1个元素的元组是特殊的问题,所以有一些额外的语法规则。元组中只包含1个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用,例如: >>>tuple1 = (50,) #1个元素的元组,需要在元素后添加逗号 >>>type(tuple1) #加逗号,类型为元组 运行结果如下。 >>>tuple2 = (50) >>>type(tuple2) #不加逗号,类型为整数 4.创建元素类型不同的元组 元组中元素的元素类型可以不相同,例如: >>>bookData=(2,"给Python点颜色 青少年学编程",59.80,"人民邮电出版社") >>>bookData 运行结果如下。 (2, '给Python点颜色 青少年学编程', 59.8, '人民邮电出版社') 5.使用tuple()函数创建数值元组 在Python中,可以使用tuple()函数创建数值元组,基本语法格式如下。 tuple(data) 其中,data表示可以转换为元组的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。 可以直接使用range()函数创建数值元组,例如: >>>tuple(range(5,15,2)) 运行结果如下。 (5, 7, 9, 11, 13) 4.2.2 访问元组元素 可以使用索引值来访问元组中的值,元组可以被索引且索引值从0开始。 例如: >>>tuple = (1, 2, 3, 4, 5, 6, 7 ) >>>print(tuple) #输出完整元组,结果包括圆括号“()” >>>print(tuple[0]) #输出元组的第1个元素 >>>print(tuple[2]) #输出元组的第3个元素 >>>print(tuple[-2]) #反向读取,输出元组的倒数第2个元素 运行结果如下。 (1, 2, 3, 4, 5, 6, 7) 1 3 6 4.2.3 截取元组 因为元组是一个序列,所以可以访问元组中指定位置的元素,也可以截取索引中的一段元素。 例如: >>>tuple = (1, 2, 3, 4, 5, 6, 7 ) >>>print(tuple) #输出元组的全部元素 >>>print(tuple[1:3]) #输出从第2个元素开始到第3个元素的所有元素 >>>print(tuple[2:]) #输出从第3个元素开始的所有元素 (1, 2, 3, 4, 5, 6, 7) (2, 3) (3, 4, 5, 6, 7) 4.2.4 连接与重复元组 元组也支持连接与重复操作,加号“+”是元组连接运算符,星号“*”是元组重复操作符。 例如: >>>tuple1, tuple2 = (1, 2, 3), (4, 5, 6) >>>tuple= tuple1+tuple2 #连接元组,连接的对象必须都是元组 >>>print(tuple) >>>print(tuple * 2) #输出2次元组 (1, 2, 3, 4, 5, 6) (1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6) 【实例4-6】演示多种形式访问元组中的值 实例4-6的代码如下所示。 fieldName=("商品ID","图书名称","价格","商品编码","出版社") bookData=("1","HTML5+CSS3移动Web开发实战","58.00","50676377587" ,"人民邮电出版社") print("输出元组fieldName所有元素:",fieldName) print("输出元组bookData所有元素:",bookData[:]) print("输出元组fieldName第2个元素:",fieldName[1]) print("输出元组fieldName倒数第1个元素:",fieldName[-1]) print("输出元组bookData第2个与第5个元素:",bookData[1:5:3]) print("输出元组bookData第2至第3个元素:",bookData[1:3]) 实例4-6的运行结果如图所示。 实例4-6的运行结果 4.2.5 修改元组元素 元组中的单个元素值是不允许修改的,例如: >>>tuple = (1, 2, 3, 4, 5, 6) >>>print(tuple[0], tuple[1:5]) 运行结果如下。 1 (2, 3, 4, 5) >>>tuple[0] = 11 #修改元组元素的操作是非法的 会出现如下所示的异常信息。 Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment 但可以对元组进行重新赋值,例如: >>>bookData=("1","HTML5+CSS3移动Web开发实战","58.00","人民邮电出版社") >>>bookData=("3","零基础学Python(全彩版)","79.80","吉林大学出版社") >>>print("输出元组bookData修改后的所有元素:",bookData) 运行结果如下。 输出元组bookData修改后的所有元素:('3', '零基础学Python(全彩版)','79.80','吉林大写出版社') 虽然元组的元素不可改变,但它可以包含可变的对象,如list列表。例如: >>>tuple = (1, 2, 3, 4, [5, 6]) >>>print(tuple) 运行结果如下。 (1, 2, 3, 4, [5, 6]) >>>tuple[4][0] = 15 #修改元组tuple中列表元素的元素是可以的 >>>print(tuple) 运行结果如下。 (1, 2, 3, 4, [15, 6]) 4.2.6 删除元组元素 元组中的元素值是不允许删除的,但可以使用del语句删除整个元组,例如: >>>tuple = (1, 2, 3, 4, 5, 6) >>>tuple[0]=() 会出现以下异常信息。 File "", line 1, in TypeError: 'tuple' object does not support item assignment >>>del tuple >>>print(tuple[0]) 以上元组被删除后,输出元组的元素会出现异常信息,输出结果如下所示。 Traceback (most recent call last): File "", line 1, in TypeError: 'type' object is not subscriptable 4.2.7 元组运算符 元组运算符如表所示。 元组运算符 序号Python表达式运算结果说明1(1, 2, 3) + (4, 5, 6)(1, 2, 3, 4, 5, 6)连接2('Go!',) * 3('Go!', 'Go!', 'Go!')重复33 in (1, 2, 3)True元素是否存在4for item in (1, 2, 3): print(item, end=" ")1 2 3迭代4.2.8 元组的内置函数与基本方法 1.Python元组的内置函数 Python元组的内置函数如表所示。 Python元组的内置函数 序号函数说明实例结果1len(tuple)计算元组中元素的个数>>>tuple = ('1', '2', '3') >>>len(tuple)32max(tuple)返回元组中元素的最大值>>>tuple = ('5', '4', '8') >>>max(tuple)83min(tuple)返回元组中元素的最小值>>>tuple = ('5', '4', '8') >>>min(tuple)42.Python元组的基本方法 Python元组主要有以下方法。 (1)count()方法,用于统计元组中指定元素中出现的次数,例如tuple.count('str')。 (2)index()方法,用于查看指定元素的索引值,例如tuple.index('str')。 (3)sorted()方法,用于对指定元组的元素进行排序,例如sorted(tuple)。 >>>tuple = ('1', '2', '3', '1', '2', '3') >>>tuple.index('2') >>>tuple.count('2') >>>sorted(tuple) 运行结果如下。 1 2 ['1', '1', '2', '2', '3', '3'] 【实例4-7】演示元组运算符、内置函数与基本方法的应用 实例4-7的代码如下所示。 fieldName=("商品ID","图书名称","价格","商品编码","出版社") bookData=("1","HTML5+CSS3移动Web开发实战","58.00","50676377587", "人民邮电出版社") bookData1=("2","PPT设计从入门到精通") bookData2=("79.00","12528944","人民邮电出版社") publisher=("人民邮电出版社") price=(58.00,59.80,79.80,49.00,89.80) book=() print("计算元组fieldName的长度:",len(fieldName)) print("输出价格最高图书的价格:",max(price)) print("输出价格最低图书的价格:",min(price)) print("输出bookData1元组初始长度:",len(bookData1)) book=bookData1+bookData2 print("输出添加2个元组后元组book的长度:",len(book)) print("输出添加2个元组后元组book的所有元素:",book[:]) print("输出重复多次的子元组:",publisher*2) print("检查指定元素是否为元组bookData的成员:","人民邮电出版社" in bookData) print("检查指定元素是否不为元组bookData的成员:","高等教育出版社" not in bookData) 实例4-7的运行结果如图所示。 实例4-7的运行结果 【任务4-2】遍历元组 【任务描述】 (1)在项目Unit04中创建Python程序文件4-2.py。 (2)使用for循环语句遍历元组,输出元组所有元素的值。 (3)使用for循环语句结合enumerate()函数遍历元组,输出元组所有元素的索引值和元素值。 【任务实施】 1.创建Python程序文件4-2.py 在PyCharm项目Unit04中新建Python程序文件4-2.py,同时PyCharm主窗口显示程序文件4-2.py的代码编辑窗口,在该程序文件的代码编辑窗口自动添加了模板内容。 2.编写Python程序代码 在新建文件4-2.py的代码编辑窗口已有模板注释内容下面输入程序代码,程序文件4-2.py的代码如电子活页4-4所示。 单击工具栏中的【保存】按钮,保存程序文件4-2.py。 3.运行Python程序 在PyCharm主窗口选择【Run】菜单,在弹出的下拉菜单中选择【Run】。在弹出的【Run】对话框中选择“4-2”选项,程序文件4-2.py开始运行。 程序文件4-2.py的运行结果如下。 遍历输出元组fieldName和bookData所有元素: 商品ID 图书名称 价格 商品编码 出版社 1 HTML5+CSS3移动Web开发实战 58.00 50676377587 人民邮电出版社 遍历输出元组bookData所有元素的索引值和元素值: 1 1 2 HTML5+CSS3移动Web开发实战 3 58.00 4 50676377587 5 人民邮电出版社 4.3 字典的创建与应用 字典(dictionary)也是Python中一种非常有用的数据类型。字典是一种映射类型(mapping type),用花括号“{}”标识,它的元素是“键值”对。 列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于字典当中的元素是通过键来存取的,而不是通过偏移存取。 4.3.1 创建字典 字典是一个无序的键值对的集合,字典以键(key)为索引,一个键对应一个值(value)信息,可以存储Python支持的任意类型对象。 1.直接使用花括号“{}”创建字典 定义字典时,字典的所有元素放入花括号“{}”中,每个元素都包含 “键”和“值”两个部分,字典的每个键和值之间用冒号“:”分隔,如key:value,每个元素(键值对)之间用逗号“,”分隔,基本语法格式如下所示。 dictionary = {key1 : value1, key2 : value2,…, keyn : valuen} 例如: >>>dict = {"name":"李明","age":21,"gender":"男","math":86,"english":92} >>>dict1 = {"name":"李明","age":21,"gender":"男"} >>>dict2 = {"math":86,"english":92} 字典中值可以是任何Python对象,既可以是标准的对象,也可以是用户定义的对象,但键不行。字典中键的特性如下。 (1)同一个字典中,键必须是唯一的,必须互不相同。 不允许同一个键出现两次。创建字典时如果同一个键被赋值两次,后一个值会被记住,例如: >>>dict = {"name":"李明","age":21,"gender":"男","math":86,"english":92,"name":"LiMing"} >>>print(dict) >>>print(dict["name"]) 运行结果如下。 {'name': 'LiMing', 'age': 21, 'gender': '男', 'math': 86, 'english': 92} LiMing (2)字典的键必须是不可变类型,而值可以取任何数据类型,并且值不必唯一。 字典的键必须是不可变的类型,可以用数字、字符串或元组充当,但列表和包含可变类型元素的元组不能作为键。 2.创建空字典 (1)使用空“{}”创建空字典,例如: >>>dictionary = {} #创建空字典 >>> print(dictionary) 运行结果如下。 {} (2)使用dict()方法创建空字典,例如: >>>dictionary=dict() >>>print(dictionary) 运行结果如下。 {} 3.通过映射函数创建字典 使用dict()方法和zip()函数通过已有数据快速创建字典的基本语法格式如下。 dictionary=dict(zip(listkey,listvalue)) 其中,zip()函数用于将多个列表或元组对应位置的元素组合为元组,并返回包含这些内容的zip对象。如果想得到元组,可以使用tuple()函数将zip对象转换为元组;如果想得到列表,则可以使用list()函数将其转换为列表。 listkey是一个用于指定要生成字典的键的列表,listvalue是一个用于指定要生成字典的值的列表。 例如: >>>listkey=["name","age","gender"] >>>listvalue =["李明",21, "男"] >>>dictionary=dict(zip(listkey,listvalue)) >>>print(dictionary) 运行结果如下。 {'name': '李明', 'age': 21, 'gender': '男'} 4.通过给定的“键参数”创建字典 使用dict()方法,通过给定的“键参数”创建字典的基本语法格式如下。 dictionary =dict(key1=value1, key2=value2,…, keyn=valuen) 其中,key1、key2、……、keyn表示参数名,必须是唯一的,并且要求符合Python标识符的命名规则,这些参数名会转换为字典的键。value1、value2、……、valuen表示参数值,可以是任何数据类型,不是必须唯一的,这些参数值将被转换为字典的值。 例如: >>>dictionary = dict(name="李明",age=21,gender="男") >>>print(dictionary) 运行结果如下。 {'name': '李明', 'age': 21, 'gender': '男'} 在Python中,还可以使用dict对象的fromkeys()方法创建值为空的字典,其基本语法格式如下。 dictionary=dict.fromkeys(list) 其中,list表示字典的键列表。 也可以通过已经存在的元组和列表创建字典,基本语法格式如下。 dictionary={tuple:list} 其中,tuple表示作为键的元组,list表示作为值的列表。 4.3.2 访问字典的值 1.通过键值对访问字典的值 字典中的元素以键信息为索引进行访问,把相应的键放入方括号中即可访问字典的值。Python中使用字典的get()方法也可获取指定键的值。 【实例4-8】演示多种形式访问字典的键与值 实例4-8的代码如下所示。 dict = {"name":"李明","age":21,"gender":"男","math":86,"english":92} print(dict["name"]," ",dict["age"]) #通过键查询 print(dict) #输出完整的字典 print(dict.keys()) #输出所有键 print(dict.values()) #输出所有值 实例4-8的运行结果如下。 李明 21 {'name': '李明', 'age': 21, 'gender': '男', 'math': 86, 'english': 92} dict_keys(['name', 'age', 'gender', 'math', 'english']) dict_values(['李明', 21, '男', 86, 92]) 如果使用字典里没有的键访问数据,会出现异常,例如: >>>print(dict["Name"]) 会出现以下异常信息。 Traceback (most recent call last): File "D:/PycharmProject/Practice/Unit04/p4-8.py", line 11, in print(dict["Name"]," ",dict["age"]) KeyError: 'Name' 2.遍历字典 Python提供了遍历字典的方法,使用字典的items()方法可以获取字典的全部键值对列表,其基本语法格式如下。 dictionary.items() 其中,dictionary表示字典对象,返回值为可遍历的键值对的元组。想要获取具体的键值对,可以通过for循环遍历该元组。 Python中还提供了keys()方法和values()方法,分别用于返回字典的键和值的列表,想要获取具体的键和值,也要通过for循环遍历该列表。 4.3.3 修改与添加字典的值 字典长度是可变的,可以通过对键赋值的方法实现增加或修改键值对。向字典中添加元素的基本语法格式如下。 dictionary[key]=value 其中,key表示要添加元素的键,必须是唯一的,并且不可变,可以是字符串、数字或元组。value表示要添加元素的值,可以是任何Python支持的数据类型,不必须唯一。 可以先创建空字典,然后添加字典的值,例如: >>>dict = {} >>>dict["name"] = "李明" >>>dict["age"]=22 >>>dict["gender"]="男" >>>print(dict) 运行结果如下。 {'name': '李明', 'age': 22, 'gender': '男'} 由于在字典中键必须是唯一的,如果新添加元素的键与已经存在的键重复,则将使用新值替换原来该键的值,这就相当于修改字典的元素。 例如: >>>dict = {"name":"李明","age":21,"gender":"男"} >>>dict["age"]=23 #修改age的值 >>>dict["math"]=90 #添加一个键值对 >>>print(dict) 运行结果如下。 {'name': '李明', 'age': 23, 'gender': '男', 'math': 90} 4.3.4 删除字典元素 在Python中,使用del语句可以删除字典中的某个元素,也能删除字典。使用clear()方法可以清空字典,使用pop()方法可以删除并返回指定键的元素。 例如: >>>dict = {"name":"李明","age":21,"gender":"男"} >>>del dict["age"] #删除1个键值对age >>>print(dict) 运行结果如下。 {'name': '李明', 'gender': '男'} 如果删除一个不存在的键时,将会出现异常。 例如: >>>del dict #删除字典dict >>>print(dict["name"]) 运行结果如下。 Traceback (most recent call last): File "", line 1, in TypeError: 'type' object is not subscriptable 引发异常的原因是使用del语句执行删除字典的操作后,该字典已不再存在。 【实例4-9】演示访问、修改与删除字典的值 实例4-9的代码如下所示。 bookData={"商品ID":"1","图书名称":"HTML5+CSS3移动Web开发实战","价格":"58.00"} bookData1={"商品ID":"4","图书名称": "给Python点颜色 青少年学编程"} print("输出字典bookData所有元素:",bookData) print("输出字典bookData中指定键'图书名称'的值:",bookData['图书名称']) print("输出bookData3字典初始长度为:",len(bookData1)) bookData1['价格']=59.80 print("bookData3字典添加1个元素的长度为:",len(bookData1)) print("输出添加1个元素的字典bookData1所有元素:",bookData1) del bookData1['价格'] print("bookData3字典删除1个元素的长度为:",len(bookData1)) print("输出删除1个元素的字典bookData3所有元素:",bookData1) bookData['价格']=45.20 print("输出修改了价格键对应值的字典bookData所有元素:",bookData) 实例4-9的运行结果如图所示。 实例4-9的运行结果 4.3.5 字典的内置函数与基本方法 1.字典的内置函数 Python字典包含的内置函数如表所示。对于已定义的字典dict = {"name":"李明","age":21,"gender":"男"},各实例的运行结果如表所示。 Python字典包含的内置函数 序号函数说明实例结果1len(dict)计算字典中元素的个数,即键的总数len(dict)32str(dict)输出字典,以可打印的字符串表示str(dict)"{'name': '李明', 'age': 21, 'gender': '男'}"3type(variable)返回输入的变量的类型,如果变量是字典就返回字典类型type(dict)2.字典的基本方法 Python中字典的基本方法如电子活页4-5所示。 【实例4-10】演示Python中多种内置函数与方法的应用 实例4-10的代码如下所示。 fieldName1=["商品ID","图书名称","价格","商品编码"] fieldName2=("图书名称","价格","商品编码") bookData1=["2","PPT设计从入门到精通","79.00","12528944"] bookData2=["零基础学Python(全彩版)","79.80","12353915"] book=dict(zip(fieldName1,bookData1)) print("计算字典book的长度:",len(book)) print("输出字典book的所有元素:",book) print("输出字典book中指定键'价格'的值:",book['价格'] if '价格' in book else '没有该键') print("输出字典book中指定键'商品编码'的值:",book.get('商品编码','没有该键')) bookDict={fieldName2:bookData2} print("输出字典bookDict的长度:",len(bookDict)) print("输出字典bookDict的所有元素:",bookDict) 实例4-10的运行结果如下。 计算字典book的长度: 4 输出字典book的所有元素:{商品ID':2', '图书名称': 'PPT设计从入门到精通', '价格': '79.00', '商品编码': '12528944'} 输出字典book中指定键'价格'的值: 79.00 输出字典book中指定键'商品编码'的值: 12528944 输出字典bookDict的长度: 1 输出字典bookDict的所有元素: {('图书名称', '价格', '商品编码'): ['零基础学Python(全彩版)', '79.80', '12353915']} 【任务4-3】遍历字典 【任务描述】 (1)在项目Unit04中创建Python程序文件4-3.py。 (2)使用for循环语句遍历字典,输出字典所有元素的值。 (3)使用for循环语句结合items()方法遍历字典,输出字典所有元素的键和值。 【任务实施】 在PyCharm项目Unit04中创建Python程序文件4-3.py。在程序文件4-3.py中编写程序代码,实现所需功能,程序文件4-3.py的代码如下所示。 bookData={"商品ID": "1", "图书名称": "HTML5+CSS3移动Web开发实战", "价格": "58.00"} print("遍历输出字典bookData所有元素:") for item in bookData.items(): print(item) print("遍历输出字典bookData所有键与值:") for key,value in bookData.items(): print(key,":",value,end=" ") 程序文件4-3.py的运行结果如下。 遍历输出字典bookData所有元素: ('商品ID', '1') ('图书名称', 'HTML5+CSS3移动Web开发实战') ('价格', '58.00') 遍历输出字典bookData所有键与值: 商品ID : 1 图书名称 : HTML5+CSS3移动Web开发实战 价格 : 58.00 【任务4-4】综合应用列表、元组、字典输出商品信息与商品详情 【任务描述】 (1)在项目Unit04中创建Python程序文件4-4.py。 (2)综合应用列表、元组、字典输出商品信息与商品详情。 【任务实施】 在PyCharm项目Unit04中创建Python程序文件4-4.py。在程序文件4-4.py中编写程序代码,实现所需功能,程序文件4-4.py的代码与运行结果如电子活页4-6所示。 4.4 集合的创建与应用 集合(set)是一个无序的不重复元素序列,由一个或数个形态各异的整体组成,构成集合的事物或对象称作元素或成员。 4.4.1 创建集合 集合使用花括号“{}”表示,元素间用逗号分隔;集合中的每个元素都是唯一的,不存在相同元素,集合元素之间无序。 可以使用花括号“{}”或者set()函数创建集合,创建空集合只能使用set()函数实现,而不能使用花括号“{}”实现。因为在Python中,直接使用花括号“{}”表示创建空字典,而不是空集合。 1.直接使用花括号“{}”创建集合 使用花括号“{}”创建集合的基本语法格式如下。 sets = {element1, element2, element3,…,elementn} 其中,sets表示集合的名称,可以是任何符合Python命名规则的标识符;element1、element2、element3、……、elementn表示集合中的元素,元素个数没有限制,并且只要是Python支持的数据类型就可以。 在创建集合时,如果出现了重复的元素,Python会自动只保留一个元素,重复的元素被自动去掉。 例如: >>>fruits = {"苹果", "橘子", "苹果", "梨", "橘子", "香蕉"} >>>print(fruits) #输出集合,重复的元素被自动去掉 运行结果如下。 {'苹果', '梨', '香蕉', '橘子'} 2.使用set()函数创建集合 在Python中创建集合时推荐使用set()函数实现,可以使用set()函数将列表、元组等其他可迭代对象转换为集合。使用set()函数创建集合的基本语法格式如下。 sets =set(iteration) 其中,iteration表示要转换为集合的可迭代对象,可以是列表、元组、range对象等。另外,也可以是字符串,如果是字符串,返回的集合将包含全部不重复字符的集合。 例如: >>>fruits1 = set(["苹果", "橘子", "梨","香蕉"]) >>>print(fruits1) 运行结果如下。 {'苹果', '梨', '香蕉', '橘子'} >>>fruits2 = set(("苹果", "橘子", "梨", "香蕉")) >>>print(fruits2) 运行结果如下。 {'苹果', '梨', '香蕉', '橘子'} 4.4.2 修改与添加集合的元素 添加集合元素的基本语法格式如下。 sets.add( x ) 将元素x添加到集合sets中,添加的元素内容只能使用字符串、数字、布尔值、元组等不可变对象,不能使用列表、字典等可变对象。如果元素已存在,则不进行任何操作。 例如: >>>fruits = {"苹果", "橘子"} >>>fruits.add("香蕉") >>>print(fruits) 运行结果如下。 {'苹果', '香蕉', '橘子'} 还有一个方法也可以添加元素,并且参数可以是列表、字典等可变对象,其基本语法格式如下。 sets.update( x ) 添加的元素可以有多个,用逗号分开。 >>>fruits = {"苹果", "橘子"} >>>fruits.update({"香蕉"}) >>>print(fruits) 运行结果如下。 {'苹果', '香蕉', '橘子'} >>>fruits = {"苹果", "橘子"} >>>fruits.update(["香蕉", "梨"]) >>>print(fruits) 运行结果如下。 {'苹果', '梨', '香蕉', '橘子'} 4.4.3 删除集合元素 1.删除指定集合元素 从集合中删除指定集合元素的基本语法格式如下。 sets.remove( x ) 将元素x从集合sets中删除,如果指定的元素不存在,则会出现异常。 例如: >>>fruits = {"苹果", "橘子", "梨", "香蕉"} >>>fruits.remove("梨") >>>print(fruits) 运行结果如下。 {'苹果', '香蕉', '橘子'} >>>fruits = {"苹果", "橘子", "梨", "香蕉"} >>>fruits.remove("樱桃") #待删除集合元素不存在时,会出现异常 Traceback (most recent call last): File "", line 1, in KeyError: '樱桃' 使用discard()也能删除集合中的指定元素,并且即使指定元素不存在也不会出现异常。 基本语法格式如下所示。 sets.discard( x ) 例如: >>>fruits = {"苹果", "橘子", "梨", "香蕉"} >>>fruits.discard ("梨") >>>fruits.discard ("樱桃") #待删除集合元素不存在也不会出现异常 >>>print(fruits) 运行结果如下。 {'苹果', '香蕉', '橘子'} 2.随机删除集合中的一个元素 使用pop()方法可以实现随机删除集合中的一个元素,其基本语法格式如下。 sets.pop() 集合的pop()方法会对集合进行无序的排列,然后将这个无序排列集合的左边第一个元素删除。 例如: >>>fruits = {"苹果", "橘子", "梨", "香蕉"} >>>fruits.pop() 运行结果如下。 '苹果' >>>fruits.pop() 运行结果如下。 '梨' 使用pop()方法随机删除集合中的元素时,多次运行测试的结果可能不一样。 3.清空集合 使用clear()方法可以删除集合中的全部元素,实现清空集合,其基本语法格式如下。 sets.clear() 例如: >>>fruits = {"苹果", "橘子", "梨", "香蕉"} >>>fruits.clear() >>>print(fruits) 运行结果如下。 set() 【实例4-11】演示在Python集合中添加与删除元素的操作 实例4-11的代码如下所示。 bookData1={"2","PPT设计从入门到精通"} bookData2={"3","零基础学Python(全彩版)","79.80","12353915","吉林大学出版社"} bookData1.add("79.00") bookData1.add("12528944") bookData1.add("人民邮电出版社") print("输出添加了3个元素的集合bookData1:",bookData1) bookData2.remove('12353915') print("输出删除了指定元素的集合bookData2:",bookData2) bookData2.pop() print("输出删除了1个元素的集合bookData2:",bookData2) bookData2.clear() print("输出清空的集合bookData2:",bookData2) 实例4-11的运行结果如图所示。 实例4-11的运行结果 4.4.4 集合的内置函数与基本方法 1.计算集合元素个数 使用len()函数可以计算集合的元素个数,其基本语法格式如下。 len(sets) 例如: >>>fruits = {"苹果", "橘子", "梨", "香蕉","樱桃"} >>>len(fruits) 运行结果如下。 5 【实例4-12】演示Python中集合的内置函数的应用 实例4-12的代码如下所示。 bookData=set(["1","HTML5+CSS3移动Web开发实战","58.00"]) price={58.00,59.80,79.80,49.00,89.80,45.00} print("计算集合fieldName的长度:",len(bookData)) print("输出价格最高的图书的价格:",max(price)) print("输出价格最低的图书的价格:",min(price)) 实例4-12的运行结果如下。 计算集合fieldName的长度: 3 输出价格最高的图书的价格: 89.8 输出价格最低的图书的价格: 45.0 2.判断元素是否在集合中存在 使用成员运算符in或not in可以判断元素在集合中是否存在或是否不存在。 (1)使用in判断。 使用运算符in的基本语法格式如下。 x in sets 判断元素x是否在集合sets中,x在集合sets中则返回True,否则返回False。 (2)使用not in判断。 使用运算符not in的基本语法格式如下。 x not in sets 判断元素x是否不在集合sets中,x不在集合sets中则返回True,否则返回False。 例如: >>>fruits = {"苹果", "橘子", "梨", "香蕉","樱桃"} >>>"樱桃" in fruits 运行结果如下。 True >>>"草莓" not in fruits 运行结果如下。 True 3.集合的基本方法 集合的基本方法如表所示。 集合的基本方法 序号方法说明1add()为集合添加元素2update()为集合添加元素3remove()删除集合中指定的元素(如果指定元素不存在会引发异常)4discard()删除集合中指定的元素(如果指定元素存在)5pop()随机删除集合中的元素6difference_update()删除集合中的元素,但该元素在指定集合中仍存在7clear()删除集合中的所有元素,即清空集合8copy()复制一个集合,返回集合的一个副本9union()返回两个集合的并集10intersection()返回集合的交集11intersection_update()返回集合的交集12difference()返回多个集合的差集13symmetric_difference()返回两个集合中不重复的元素集合14symmetric_difference_update()删除当前集合中与另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入当前集合15isdisjoint()判断两个集合是否包含相同的元素,如果没有返回True,否则返回False16issubset()判断指定集合是否为该方法参数集合的子集17issuperset()判断该方法的参数集合是否为指定集合的子集4.4.5 集合运算 两个集合可以进行集合运算,较常见的集合运算是并运算(使用“|”运算符)、交运算(使用“&”运算符)、差运算(使用“-”运算符)。 【实例4-13】演示两个集合间的多种运算 实例4-13的代码如下所示。 basket= {"苹果", "橘子", "梨", "香蕉","樱桃","桂圆"} box={"柚子", "橘子", "荔枝", "桂圆"} bag={"橘子","桂圆"} print(basket | box) #并运算,集合basket和box中包含的所有元素 print(basket & box) #交运算,集合basket和box中同时都包含的公共元素 print(basket-box) #差运算,集合basket中包含而集合box中不包含的元素 print(basket ^ box) #包括集合basket和box中的非相同元素 print(bagbag) #返回True或者False,判断basket是否包含box 实例4-13的运行结果如下。 {'桂圆', '梨', '橘子', '苹果', '香蕉', '柚子', '荔枝', '樱桃'} {'桂圆', '橘子'} {'苹果', '樱桃', '香蕉', '梨'} {'梨', '苹果', '香蕉', '柚子', '荔枝', '樱桃'} True True 【任务4-5】遍历集合 【任务描述】 (1)在项目Unit04中创建Python程序文件4-5.py。 (2)使用集合名称输出集合所有元素的值。 (3)使用for循环语句遍历集合,输出集合所有元素的值。 【任务实施】 在PyCharm项目Unit04中创建Python程序文件4-5.py。在程序文件4-5.py中编写程序代码,实现所需功能,程序文件4-5.py的代码与运行结果如电子活页4-7所示。 4.5 字符串的常用方法及其应用 Python中的字符串(string)使用单引号“''”、双引号“""”、三引号“'''”或“"""”标注,这3种引号形式在语义上没有差别,只是在形式上有些差别。其中单引号和双引号内的字符序列必须在一行中,而三引号内的字符序列可以分布在连续的多行上。 Python不支持单字符类型,单字符在Python中是作为一个字符串使用,一个字符就是长度为1的字符串。 4.5.1 创建字符串 创建字符串很简单,只要为变量分配一个值即可。例如: str1 = 'Hello Python!' str2 = 'LiMing' str3="The quick brown fox jumps over a lazy dog" 如果字符串本身包含单引号但不含双引号,则通常会用双引号将字符串标注,否则通常使用单引号标注。这样标识的字符串,print()函数会产生更易读的输出结果。 4.5.2 访问字符串中的值 字符串是字符的序列,可以把字符串看作一种特殊的元组,可以按照单个字符或字符片段进行索引。Python中的字符串有两种索引方式,第1种是从左往右计数,索引值以0为开始值依次增加,字符串的第1个字符的索引值为0,下图中第2行的数字0、1、2、3、4、5表示各个字符的索引值;第2种是从右往左计数,使用负数,以-1为末尾的开始位置,从-1开始依次减少,图4-11中第4行的数字表示相应的负数索引值。 字符串的索引值 【实例4-14】演示多种形式访问字符串中的值 实例4-14的代码如下所示。 str='python' print(str) #输出字符串 print(str[0]) #输出第1个字符 print(str[-1]) #输出倒数第1个字符 print(str[3]) #输出第4个字符 print(str[-3]) #输出倒数第3个字符 print('Hello\npython') #使用\n转义特殊字符,换行输出 print(r'Hello\npython') #在字符串前面添加一个r,表示原始字符串,不会发生转义 实例4-14的运行结果如下。 python p n h h Hello python Hello\npython 4.5.3 截取字符串 可以对字符串进行截取操作,获取一段子字符串。 截取字符串的基本语法格式如下。 变量[头索引值:尾索引值:步长] 前2个参数表示索引值,用冒号分隔两个索引值,截取的范围是前闭后开的,并且两个索引值都可以省略。默认的第1个索引值为0,如果第1个索引值为0,那么第2个索引值默认为字符串可以被截取的长度。对于非负数截取部分,如果索引都在有效范围内,截取部分的长度就是索引的差值。例如,str[1:3]的长度是2。 例如: str[ i:j ]表示截取从第i+1(索引值为i)个字符开始,到第j(索引值为j-1)个字符的全部字符,但截取的子字符串不包括索引值为j的字符。 字符串的索引值与截取长度如图所示。 从左往右索引012345从右往左索引-6-5-4-3-2-1+++++++|a|b|c|d|e|f|+++++++从左往右截取:12345:从右往左截取:-5-4-3-2-1:字符串的索引值与截取长度 第3个参数为截取的步长,如果省略,则默认为1,当省略该参数时,最后一个冒号也可以省略。 例如,在索引1到索引9范围内,设置步长为3(间隔2个位置)来截取字符串,代码如下所示。 >>>str='Better life' >>>print(str[1:9:3]) 运行结果如下。 eel 如果第3个参数为负数,则表示逆向读取。 3个参数都可以省略,例如print(str[::]),表示输出字符串的所有字符。 【实例4-15】演示多种形式访问字符串中的值 实例4-15的代码如下所示。 str ='abcdef' print(str[:]) #输出字符串的所有字符 print(str[::]) #输出字符串的所有字符 print(str[0:3]) #输出第1、2、3个字符 print(str[0:-3]) # 输出第1个至倒数第4个字符 print(str[2:4]) # 输出第3、4个字符 print(str[-4:-2]) # 输出倒数第4个、倒数第3个字符 print(str[2:]) # 输出第3个字符及其后面的所有字符 print(str[:4]) # 输出第1个至第4个字符 实例4-15的运行结果如下。 abcdef abcdef abc abc cd cd cdef abcd 4.5.4 连接与重复字符串 1.连接字符串 加号“+”是字符串的连接运算符,使用运算符“+”可以连接多个字符串并产生一个新的字符串。 例如: >>>first_name = "Li" >>>last_name = "Ming" >>>full_name = first_name + " " + last_name # 连接字符串 >>>print(full_name) >>>print(full_name + ',你好') # 连接字符串 运行结果如下。 Li Ming Li Ming,你好 也可以截取字符串的一部分并与其他字段连接,例如: >>>str = 'Hello World!' >>>print ("新字符串:", str[:6] + 'Python!') 运算结果如下。 新字符串: Hello Python! 2.重复字符串 使用运算符“*”实现字符串重复多次,星号“*”表示重复当前字符串,与之结合的数字为重复的次数。 例如: >>>str='go!' >>>print(str * 3) # 输出字符串3次 运行结果如下。 go!go!go! 【实例4-16】演示字符串的访问、连接等多种操作 实例4-16的代码如下所示。 fieldName="图书名称" fieldPrice="图书价格" bookName="HTML5+CSS3移动Web开发实战" bookPrice=58.00 print("字符串的基本操作") #分别输出第1个、第2个、倒数第2个、倒数第1个字符 print("输出载取不同长度的字符串1:",bookName[0]+" "+bookName[1]+" "\ +bookName[-2]+" "+bookName[-1]) #分别输出第1个开始到第10个字符,第13个开始到第15个字符 print("输出载取不同长度的字符串2:",bookName[:10]+" "+bookName[12:15]) #分别输出第11个开始后到第12个字符,第16个开始后的所有字符 print("输出载取不同长度的字符串3:",bookName[10:12]+" "+bookName[15:]) #使用“+”连接字符串 print("输出连接字符串1:",fieldName+"为"+bookName) print("输出连接字符串2:",fieldPrice+"为"+str(bookPrice)) 实例4-16的运行结果如下。 字符串的基本操作 输出载取不同长度的字符串1: H T 实 战 输出载取不同长度的字符串2: HTML5+CSS3 Web 输出载取不同长度的字符串3: 移动 开发实战 输出连接字符串1: 图书名称为HTML5+CSS3移动Web开发实战 输出连接字符串2: 图书价格为58.0 4.5.5 修改与添加字符串中的字符 由于Python中的字符串不能被改变,如果给一个字符串的某个索引位置赋值,会出现异常信息。 例如: >>>str='go' >>>str[0]= 't' 运行后会出现以下异常信息。 File "", line 1, in TypeError: 'str' object does not support item assignment >>>str[2]= 's' 运行后也会出现以下异常信息。 File "", line 1, in TypeError: 'str' object does not support item assignment 所以不能修改字符串中的任意字符,也不能在字符串末尾添加字符,但可以通过截取子字符串与连接字符串的方法对字符串中的字符进行修改与添加。 >>>str="go" >>>print("Let's "+str) >>>print("t"+str[1:]) >>>print(str+"es") 运行结果如下。 Let's go to goes 4.5.6 字符串运算符 Python字符串运算符如表所示。表实例中的变量a的值为字符串“Hello”,变量b的值为“Python”。 Python字符串运算符 序号操作符说明实例结果1+连接字符串a + bHelloPython2*复制字符串a*2HelloHello3[]通过索引获取字符串中的字符a[1]e4[ : ]截取字符串中的一部分,遵循左闭右开原则,str[0:2]是不包含第3个字符的a[1:4]ell5in成员运算符:如果字符串中包含给定的字符返回True,否则返回False'H' in aTrue6not in成员运算符:如果字符串中不包含给定的字符返回True,否则返回False'M' not in aTrue7r/R表示原始字符串,所有的字符串都是直接按照字面的字符串输出,没有转义或不能打印的字符。原始字符串除在字符串的第一个引号前加上字母r(可以大写)以外,与普通字符串有着几乎完全相同的语法print( r'\n' ) print( R'\n' )\n \n4.5.7 字符串常用的内置函数与基本方法 1.计算字符串长度 Python中使用len()函数计算字符串的长度,其基本语法格式如下。 len(string) 该函数返回字符串的长度,默认情况下,计算字符串的长度时不区分英文字母、数字和汉字,每个字符的长度都计为“1”。 例如: >>>str = "python" >>>print(len(str)) 6 如果要获取字符串实际所占的字节数,可以使用encode()方法编码后再进行获取,获取采用UTF-8编码的字符串的长度的基本语法格式为:len(str.encode()),获取采用GBK编码的字符串的长度的基本语法格式为:len(str.encode("GBK"))。 2.计算字符串中值最大与最小的字符 (1)max(str)方法。 max(str)方法返回字符串str中值最大的字符。 (2)min(str)方法。 min(str)方法返回字符串str中值最小的字符。 3.检索字符串 Python对字符串对象提供了多个字符串查找方法,这里介绍几种常用的方法。 (1)count()方法。 count()方法用于检索指定的字符串在另一个字符串中出现的次数,其基本语法格式如下。 count(str [,start=0 [,end=len(string)]]) 该方法返回str在指定字符串中出现的次数,如果start或者end指定则返回指定范围内str出现的次数。如果检索的字符串不存在,则返回0,否则返回出现的次数。 例如: >>>str = "hello python" >>>print(str.count('o')) 2 (2)find()方法与rfind()方法。 find()方法用于检索是否包含指定的子字符串,其基本语法格式如下。 find(str[,start=0[,end=len(string)]]) 该方法检测指定字符串是否包含str,如果包含则返回首次出现该字符串时的索引值,否则返回-1。如果指定start和end,则在指定范围内检查。可以根据find()方法的返回值是否大于-1来判断指定的字符串是否存在。 例如: >>>str = "hello python" >>>print(str.find('o')) 4 >>>print(str.find('x')) -1 rfind(str[,start=0[,end=len(string)]])方法的功能类似于find()方法,只是从右边开始查找。 (3)index()方法与rindex()方法。 index()方法的功能与find()方法的功能一样,也是用于检索是否包含指定的子字符串,只不过如果指定的子字符串不在字符串中会抛出异常。其基本语法格式如下。 index(str[,start=0[,end=len(string)]]) rindex(str[,start=0[,end=len(string)]])方法的功能类似于index()方法的功能,只是从右边开始查找。 (4)startswith()方法。 startswith()方法用于检查字符串是否以指定子字符串substr开头,如果是则返回True,否则返回False。如果指定start和end,则在指定范围内检查。其基本语法格式如下。 startswith(substr[,start=0[,end=len(string)]]) (5)endswith()方法。 endswith()方法用于检查字符串是否以suffix子字符串结束,如果是则返回True,否则返回False。如果指定start和end,则在指定范围内检查是否以suffix子字符串结束。其基本语法格式如下。 endswith(suffix[,start=0[,end=len(string)]]) 4.分割字符串 split()方法可以实现字符串分割,也就是将一个字符串按照指定的分隔符分隔为字符串列表,该列表的元素中不包括分隔符。其基本语法格式如下。 split([sep[,max=string.count(str)]]) 其中,sep用于指定分隔符,可以包含多个字符,默认为None,即所有空字符(包括空格、换行符“\n”、制表符“t”等)。max为可选参数,用于指定分割的次数,如果不指定或者为-1,则分割次数没有限制,否则返回结果中元素个数最多为max值。如果不指定sep参数,那么也不能指定max参数。 例如: >>>str = "hello python" >>>print(str.split(' ')) ['hello', 'python'] >>>print(str.split(' ',0)) ['hello python'] 5.去除字符串的空格和特殊字符 用户在输入数据时,可能会在无意中输入多余的空格,或在一些情况下字符串前后不允许出现空格和特殊字符,此时就需要去除字符串中的空格和特殊字符。这里的特殊字符一般是指回车符“\r”、换行符“\n”、制表符“\t”。 (1)strip()方法。 strip()方法用于去掉字符串左、右两侧的空格和特殊字符,其基本语法格式如下。 strip([chars]) 其中,chars为可选参数,用于指定要去除的字符,可以指定多个字符,如果不指定chars参数,默认将去除空格、回车符“\r”、换行符“\n”、制表符“\t”等。 >>>str = " p y t h o n " >>>print(str.strip()) #删除字符串两端空格 p y t h o n (2)lstrip()方法。 lstrip()方法用于去掉字符串左侧的空格和特殊字符,其基本语法格式如下。 lstrip([chars]) 可选参数chars的说明见strip()方法的相关内容。 例如: >>>str = " p y t h o n " >>>print(str.lstrip()) #删除字符串左端空格 p y t h o n (3)rstrip()方法。 rstrip()方法用于去掉字符串右侧的空格和特殊字符,其基本语法格式如下。 rstrip([chars]) 可选参数chars的说明见strip()方法的相关内容。 例如: >>>str = " p y t h o n " >>>print(str.rstrip()) #删除字符串右端空格 p y t h o n 6.字母的大小写转换 (1)lower()方法。 lower()方法用于将字符串中所有大写字母全部转换为小写字母。 例如: >>>str = "Hello Python" >>>print(str.lower()) #将字符串改为全部小写 hello python (2)upper()方法。 upper()方法用于将字符串中的所有小写字母全部转换为大写字母。 例如: >>>str = "I love python" >>>print(str.upper()) #将字符串改为全部大写 I LOVE PYTHON (3)title()方法。 title()方法返回“标题化”的字符串,所有单词都是以大写字母开始,其余字母均为小写。 例如: >>>str = "hello python" >>>print(str.title()) Hello Python 7.替换字符串 replace()方法用于替换字符串中的部分字符或子字符串,其基本语法格式如下。 replace(str1,str2[,max]) 该方法将字符串中的str1替换成str2,如果指定max,则替换不超过max次。 例如: >>>str = " p y t h o n " >>>print(str.replace(' ','')) #删除字符串中的全部空格 python Python中字符串的基本方法如电子活页4-8所示。 【实例4-17】演示字符串多种函数与方法的应用 实例4-17的代码如下所示。 bookName="HTML5+CSS3移动Web开发实战" userName=" @admin is trator. " password="admin_123" linkUrl="//item./64881864221.html" print("字符串函数与方法的应用") print("输出图书名称字符串的长度:",len(bookName)) print("输出UTF-8编码的字符串的长度:",len(bookName.encode())) print("输出GBK编码的字符串的长度:",len(bookName.encode('GBK'))) print("输出GB2312编码的字符串的长度:",len(bookName.encode('GB2312'))) print("输出密码字符串的长度:",len(password)) print("输出转换为大写字母的字符串:",bookName.upper()) print("输出转换为小写字母的字符串:",bookName.lower()) print("输出去除字符串中左右两侧的空格:","|"+userName.strip()+"|") print("输出去除字符串中左右两侧的空格和特殊字符:","|"+userName.strip('@. ')+"|") print("输出去除字符串中左侧的空格和特殊字符:","|"+userName.lstrip('@ ')+"|") print("输出去除字符串中右侧的空格和特殊字符:","|"+userName.rstrip('. ')+"|") print("输出分割字符串1:",linkUrl.split("/")) print("输出分割字符串2:",linkUrl.split(".")) print("输出分割字符串3:",linkUrl.split(".",2)) print("字符8在字符串“",linkUrl,"”中出现了",linkUrl.count('8'),"次") print("字符“.”在字符串“",linkUrl,"”中首次出现的索引为",linkUrl.find('.')) print("字符“.”在字符串“",linkUrl,"”中首次出现的索引为",linkUrl.index('.')) print("字符“.”在字符串“",linkUrl,"”中首次出现的索引为",linkUrl.rindex('.')) print("输出检索字符串是否以“//”子字符串开头:",linkUrl.startswith('//')) print("输出检索字符串是否以“html”子字符串结束:",linkUrl.endswith('html')) 实例4-17的运行结果如电子活页4-9所示。 【任务4-6】应用字符串的方法实现字符串翻转操作 【任务描述】 (1)在项目Unit04中创建Python程序文件4-6.py。 (2)分别应用字符串的方法split()、join()和字符串的访问操作实现字符串翻转操作,例如原字符串为“I love Python”,反转后的字符串变为“Python love I”。 【任务实施】 在PyCharm项目Unit04中创建Python程序文件4-6.py。在程序文件4-6.py中编写程序代码,实现所需功能,程序4-6.py的代码如下所示。 str = 'I love Python' strWord=str.split(" ") #通过空格将字符串分隔开,把各个单词分隔为列表 print(strWord) strreversal = strWord[-1::-1] #翻转字符串 print(strreversal) word = ' '.join(strreversal) #重新组合字符串 print(word) 程序4-6.py的运行结果如下。 ['I', 'love', 'Python'] ['Python', 'love', 'I'] Python love I 程序4-6.py的代码中的strWord[-1::-1]有3个参数:第1个参数-1表示最后一个元素;第2个参数为空,表示移动到单词列表开始;第3个参数为步长,-1表示逆向。 4.6 字符串的格式化输出 Python支持字符串的格式化输出。从Python 2.6开始,新增了一种格式化字符串的方法format(),它增强了字符串格式化的功能。 4.6.1 format()的基本格式 如果希望print()函数输出的形式更加多样,可以使用str.format()方法来格式化输出值,字符串格式化是为了实现字符串和变量同时输出时按一定的格式显示。 format()方法的基本格式如下。 "<模板字符串>".format(<逗号分隔的参数>) 模板字符串由一系列占位符组成(用“{}”表示),花括号“{}”及其里面的字符(称作格式化字符)将会被format()中的参数替换。调用format()方法会返回一个新的字符串。 format()方法中的模板字符串包含参数序号、半角冒号“:”、格式控制标记,格式如下。 {[<参数序号>][:[<格式控制标记>]]} 例如: >>>pi=3.14159 >>>print("常量π的值近似为:{}。".format(pi)) 运行结果如下。 常量π的值近似为:3.14159。 4.6.2 format()方法的参数序号 format()方法中参数会按“{}”中的序号替换到模板字符串的对应位置。“{}”中的默认序号为0、1、2……,参数从0开始编号,参数的顺序固定为0、1、2……。 如果“{}”中没有序号,就按先后顺序自动替换。 例如: >>>print("姓名:{},年龄:{}".format("李明", 21)) 运行结果如下。 姓名:李明,年龄:21 “{}”中的序号用于指向传入对象在format()中的位置,例如: >>>print("姓名:{0},年龄:{1}".format("李明", 21)) 运行结果如下。 姓名:李明,年龄:21 >>>print("姓名:{1},年龄:{0}".format(21,"李明")) 运行结果如下。 姓名:李明,年龄:21 如果在format()中使用了关键字参数,那么它们的值会指向使用该关键字的参数。 >>>print("姓名:{name},年龄:{age}".format(age=21,name="李明")) 运行结果如下。 姓名:李明,年龄:21 序号和关键字参数可以任意结合,例如: >>>print("姓名:{0},年龄:{1},性别:{gender}".format("李明",21, gender="男")) 运行结果如下。 姓名:李明,年龄:21,性别:男 format()方法可以方便地连接不同类型的变量或内容,如果花括号本身是字符串的一部分,而需要输出花括号,可使用“{{{”表示,其中“{{”表示“{”,例如: >>>pi=3.14159 >>>print("圆周率{{{0}{1}}}是{2}。".format(pi , "…", "无理数")) 运行结果如下。 圆周率{3.14159…}是无理数。 【任务4-7】使用format()方法格式化输出字符串列表 【任务描述】 (1)在项目Unit04中创建Python程序文件4-7.py。 (2)使用format()方法格式化输出字符串列表。 【任务实施】 在PyCharm项目Unit04中创建Python程序文件4-7.py。在程序文件4-7.py中编写程序代码,实现所需功能,程序文件4-7.py的代码如电子活页4-10所示。 程序文件4-7.py的运行结果如图所示。 程序文件4-7.py的运行结果 4.7 正则表达式及其应用 正则表达式是一种特殊的字符序列,它用于检查字符串是否与某种模式匹配。 4.7.1 Python的正则表达式 正则表达式(regular expression),又称正规表达式、规则表达式,在代码中常简写为regex、regexp或RE。正则表达式使用单个字符串来描述、匹配一系列匹配指定规则的字符串。正则表达式通常被用来检索、替换匹配指定模式的文本。 当正则表达式包含转义字符时使用原生字符串(raw string),表示为:r'text'。raw string是不包含转义字符的字符串。 例如: r'[1-9]\d{5}' r'\d{3}-\d{8}|\d{4}-\d{8}' 在Python中,使用正则表达式时,是将其作为模式字符串使用的。例如,匹配字母的一个字符的正则表达式表示为模式字符串,可以使用以下代码。 '[a-zA-Z]' 由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示,并匹配相应的特殊字符。例如,模式元素r'\t',等价于\\t。 正则表达式可以包含一些可选标志修饰符来控制匹配的模式,修饰符被指定为一个可选的标志,正则表达式修饰符(可选标志)如表所示。 正则表达式修饰符(可选标志) 序号修饰符说明1re.A(re.ASCII)只适用于Python 3,对\w、\W、\b、\B、\s、\S、\d、\D只进行ASCII匹配2re.I(re.IGNORECASE)使匹配对大小写不敏感(忽略正则表达式的大小写,[A-Z]也能够匹配小写字符)3re.L(re.LOCALE)表示特殊字符集\w、\W、\b、\B、\s、\S依赖于当前环境4re.M(re.MULTILINE)表示支持多行匹配,影响^和$,正则表达式中的边界字符^和$用于整个字符串每一行的开始处和末尾处,默认情况下,只适用于整个字符串的开始处和末尾处5re.S(re.DOTALL)能够匹配'.'并且包括换行符在内的所有字符('.'默认不包括换行符)6re.U(re.UNICODE)根据Unicode字符集解析字符,影响特殊字符集\w、\W、\b、\B、\d、\D、\s、\S7re.X(re.VERBOSE)为了增加可读性,忽略正则表达式中的空格和'#'后面的注释4.7.2 模式字符串的组成字符 1.元字符 模式字符串的元字符如电子活页4-11所示。 2.边界字符 模式字符串的边界字符如表所示。 模式字符串的边界字符 序号字符说明样例1^匹配字符串的开头^abc表示abc且在一个字符串的开头2\A表示字符串开头3$表示字符串的末尾abc$表示abc且在一个字符串的末尾4\Z表示字符串的末尾,如果存在换行,则只匹配到换行前的结束字符串5\z表字符串的末尾3.限定字符 模式字符串的限定字符如表所示。 模式字符串的限定字符 序号字符说明样例1 匹配前一个字符或子表达式0个或1个,非贪婪方式abc 表示ab、abc2+匹配前一个字符或子表达式1个或多个abc+表示abc、abcc、abccc等3*匹配前一个字符或子表达式0个或多个abc*表示ab、abc、abcc、abccc等4{n}匹配前面的字符或子表达式n个。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的2个oab{2}c表示abbc5{n,}精确匹配前面的字符或子表达式至少n次。"o{1,}"等价于"o+","o{0,}"则等价于"o*""o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o6{n,m}匹配前面的字符或子表达式至少n个,至多m个(包含m),贪婪方式ab{1,2}c表示abc、abbc4.原义字符 模式字符串的原义字符如电子活页4-12所示。 5.转义字符 模式字符串的转义字符如表所示。 模式字符串的转义字符 序号字符说明1\n匹配单个换行符2[\b]匹配单个退格符3\t匹配单个制表符4[b]匹配单个空格5\.匹配普通字符“.”6\\匹配普通字符“\”7\ 匹配普通字符“ ”8\*匹配普通字符“*”6.分组字符 模式字符串的分组字符如电子活页4-13所示。 7.最小匹配操作符 模式字符串的最小匹配操作符如表所示。 模式字符串的最小匹配操作符 序号操作符说明1* 匹配前一个字符0次或任意次扩展,最小匹配(惰性匹配,尽可能少重复)2+ 匹配前一个字符1次或任意次扩展,最小匹配(惰性匹配,尽可能少重复)3 匹配前一个字符0次或1次扩展,最小匹配(惰性匹配,尽可能少重复)4{n,m} 匹配前一个字符n至m(含m)次,最小匹配(惰性匹配,尽可能少重复)5{n,} 匹配前一个字符n次,最小匹配(惰性匹配,尽可能少重复)4.7.3 re模块的贪婪匹配和最小匹配 1.贪婪匹配 re模块默认采用贪婪匹配,即输出匹配最长的子字符串。 例如: .*:取尽可能多的任意字符。 \w+:取尽可能多的任意英文字母与数字1次以上。 \d{2,5}:尽可能取到2至5个数字、字母。 \s+:尽可能取到任意多个空格1次以上。 . :取任意字符0次或1次,尽可能取1次。 2.最小匹配(非贪婪匹配) 即在贪婪匹配符后面加一个?。字符“ ”在正则表达式中可能有两种含义:一是表示匹配前一个字符0次或1次;二是声明非贪婪匹配。 例如: .* :取尽可能少的任意字符,尽可能不取。 \w+ :取尽可能少的任意英文字母与数字,尽可能只取1个。 \d{2,5}?:取尽可能少的数字、字母,尽可能只取2个。 \s+?:尽可能取最少的空格,尽可能只取1个空格。 . :取任意字符0次或1次,尽可能取0次。 如何输出最短的子字符串呢? 例如: >>>import re >>>match = re.search(r'go.* d','godgood') >>>print(match.group()) 运行结果如下。 god 无论是贪婪匹配还是非贪婪匹配,都要与后面内容继续匹配,才能最终确定本次匹配内容,有时结合后面匹配内容时,两者取值相同。 4.8 使用re模块实现正则表达式操作 4.8.1 re模块及其主要功能函数 Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python具有全部的正则表达式功能。re模块也提供了多个函数,这些函数使用模式字符串作为它们的第1个参数。 re模块主要用于字符串匹配,在使用re模块时,需要先应用import语句引入该模块,代码如下所示。 import re re模块的主要功能函数如表所示。 re模块的主要功能函数 序号函数说明1re.match()从一个字符串的开始位置起匹配正则表达式,返回match对象2re.search()在一个字符串中搜索匹配正则表达式第一个位置的文本,返回match对象3re.findall()搜索字符串,以列表类型返回所有匹配的子字符串4re.finditer()搜索字符串,返回一个匹配结果的迭代类型,每一个迭代类型都是match对象5re.split()将一个字符串按照正则表达式匹配结果进行分割,返回列表类型6re.sub()在一个字符串中替换所有匹配正则表达式的子字符串,返回替换后的字符串1.re.match()函数 re.match()函数尝试从字符串的起始位置匹配一个模式。如果在起始位置匹配成功,re.match()函数会返回一个匹配的对象,否则返回None。如果不是起始位置匹配成功的话,也返回None。因为re.match()函数从字符串的开始位置开始匹配,当第1个字符不符合模式字符串时,则不进行匹配,直接返回None。 函数基本语法格式如下。 re.match(pattern, string, [flags=0]) re.match()函数的参数说明如表所示。 re.match()函数的参数说明 序号参数说明1pattern匹配时使用的正则表达式2string待匹配的字符串3flags标志位,用于控制正则表达式的匹配方式,例如是否区分大小写、是否多行匹配等。参见“表4-13 正则表达式修饰符(可选标志)”返回的match对象中包含匹配值的位置和匹配数据,可以使用group(num)或groups()方法来获取这些匹配数据。re模块主要功能函数的主要方法如表所示。 re模块主要功能函数的主要方法 序号方法说明1group(num=0)返回匹配正则表达式的字符串,group()可以一次输入多个组号,在这种情况下将返回一个包含组所对应的值的元组2groups()返回包含所有子组字符串的元组3groupdict()返回有别名的组的别名为“键”、以该组截获的子字符串为“值”的字典4start()返回匹配字符串在原始字符串的开始位置5end()返回匹配字符串在原始字符串的结束位置6span()返回包含匹配的位置(开始、结束)的元组例如: >>>import re >>>print(re.match('www', 'www.')) #在起始位置匹配 >>>print(re.match('www', 'www.').start()) >>>print(re.match('www', 'www.').end()) >>>print(re.match('www', 'www.').span()) >>>print(re.match('com', 'http://www.')) #不在起始位置匹配 运行结果如下。 0 3 (0, 3) None 【实例4-18】演示re.match()函数的匹配对象方法的应用 实例4-18的代码如下所示。 import re sentence = "Zhangshan is taller than Lisi " #.*表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符 match = re.match(r'(.*) is (.* ) .*', sentence, re.M | re.I) if match: print("match.group():", match.group()) print("match.group(0):", match.group(0)) print("match.group(1):", match.group(1)) print("match.group(2):", match.group(2)) print("match.groups():", match.groups()) print("match.groupdict():", match.groupdict()) else: print("No match!") 实例4-18的运行结果如下。 match.group(): Zhangshan is taller than Lisi match.group(0): Zhangshan is taller than Lisi match.group(1): Zhangshan match.group(2): taller match.groups(): ('Zhangshan', 'taller') match.groupdict(): {} 2.re.search()函数 re.search()函数用于在一个字符串中搜索匹配正则表达式的第一个位置,如果匹配成功,则re.search()函数返回match对象,否则返回None。 re.search()函数的基本语法格式如下。 re.search(pattern, string, [flags=0]) re.search()函数的参数说明如表所示。 re.search()函数的参数说明 序号参数说明1pattern匹配的正则表达式或原生字符串2string待匹配的字符串3flags标志位,用于控制正则表达式的匹配方式,例如是否区分大小写、是否多行匹配等。参见“表4-13 正则表达式修饰符(可选标志)”可以使用group(num)或groups()方法来获取匹配的正则表达式。其中group(num=0)用于匹配整个正则表达式的字符串,group()可以一次输入多个组号,在这种情况下将返回一个包含组所对应的值的元组。groups()用于返回包含所有子组字符串的元组。 例如: >>>import re >>>print(re.search('www', 'www.')) #在起始位置匹配 >>>print(re.search('www', 'www.').start()) >>>print(re.search('www', 'www.').end()) >>>print(re.search('www', 'www.').span()) >>>print(re.search('com', 'http://www.')) #不在起始位置匹配 >>>print(re.search('com', 'http://www.').span()) 运行结果如下。 0 3 (0, 3) (14, 17) 【实例4-19】演示re.search()函数的匹配对象方法的应用 实例4-19的代码如下所示。 import re sentence = "Zhangshan is taller than Lisi " #.*表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符 search = re.search(r'(.*) is (.* ) .*', sentence, re.M | re.I) if search: print("search.group():", search.group()) print("search.group(0):", search.group(0)) print("search.group(1):", search.group(1)) print("search.group(2):", search.group(2)) print("search.groups():", search.groups()) print("search.groupdict():", search.groupdict()) else: print("Not found!!") 实例4-19的运行结果如下。 search.group(): Zhangshan is taller than Lisi search.group(0): Zhangshan is taller than Lisi search.group(1): Zhangshan search.group(2): taller search.groups(): ('Zhangshan', 'taller') search.groupdict(): {} re.search()函数与re.match()函数的主要区别如下。 re.search()函数匹配整个字符串,直到找到一个匹配,不仅仅是从字符串的开始位置搜索,其他位置有符合的匹配也可以。而re.match()函数只匹配字符串的开始位置,如果字符串开始位置不符合正则表达式,则匹配失败,函数返回None。 3.re.findall()函数 re.findall()函数用于在字符串中找到正则表达式所匹配的所有子字符串,如果匹配成功,则以列表的形式返回,如果匹配失败,则返回空列表。 re.findall()函数的基本语法格式如下。 re.findall(pattern,string[, pos[, endpos]]) 参数说明如表所示。 re.findall()函数的参数说明 序号参数说明1pattern表示模式字符串。如果在指定的模式字符串中包含了分组,则返回与分组匹配的文本列表2string表示待匹配的字符串3pos可选参数,指定正则表达式搜索字符串的开始位置,默认为04endpos可选参数,指定正则表达式搜索字符串的结束位置,默认为字符串的长度例如查找字符串中的数字: >>>import re >>>pattern = pile(r'\d+') # 查找数字 >>>result1= pattern.findall('number 506 phone 22783888') >>>result2= pattern.findall('number 506 phone 22783888', 0, 20) >>>print(result1) >>>print(result2) 运行结果如下。 ['506', '22783888'] ['506', '227'] 4.re.finditer()函数 re.finditer()函数和re.findall()函数类似,是指在字符串中找到正则表达式所匹配的所有子字符串,并把它们作为一个迭代器返回。 re.finditer()函数的基本语法格式如下。 re.finditer(pattern, string, flags=0) re.finditer()函数的参数说明如表所示。 re.finditer()函数的参数说明 序号参数说明1pattern匹配的正则表达式2string待匹配的字符串3flags标志位,用于控制正则表达式的匹配方式,例如是否区分大小写、是否多行匹配等。参写“表4-13 正则表达式修饰符(可选标志)”例如: >>>import re >>>password="Good_123#Better456$888" >>>iterator = re.finditer(r"\d+",password) >>>for match in iterator: >>> print(match.group()) 运行结果如下。 123 456 888 5.re.split()函数 re.split()函数按照能够匹配的子字符串将字符串分割后返回列表,其基本语法格式如。 re.split(pattern, string[, maxsplit=0, flags=0]) re.split()函数的参数说明如表所示。 re.split()函数的参数说明 序号参数说明1pattern匹配的正则表达式2string待匹配的字符串3maxsplit表示最大的分隔次数,默认值为0,表示不限制次数,maxsplit=1表示分隔1次,剩余部分作为最后一个元素输出4flags标志位,用于控制正则表达式的匹配方式,例如是否区分大小写、是否多行匹配等。参见“表4-13 正则表达式修饰符(可选标志)”例如: >>>import re >>>re.split('\W+', 'Create a better life.') >>>re.split('(\W+)', 'Create a better life.') >>>re.split('\W+', 'Create a better life.', 1) >>>re.split('a*', 'better') #对于一个找不到匹配的字符串,split不会对其进行分割 运行结果如下。 ['Create', 'a', 'better', 'life', ''] ['Create', ' ', 'a', ' ', 'better', ' ', 'life', '.', ''] ['Create', 'a better life.'] ['', 'b', 'e', 't', 't', 'e', 'r', ''] 6.re.sub()函数 Python的re模块提供了re.sub()函数用于替换字符串中的匹配项。 re.sub()函数的基本语法格式如下。 re.sub(pattern, repl, string[, count=0, flags=0]) re.sub()函数用于在一个字符串中替换所有匹配正则表达式的子字符串,返回替换后的字符串。如果模式没有发现,字符串将被没有改变地返回。 re.sub()函数的参数说明如表所示,前3个为必选参数,后2个为可选参数。 re.sub()函数的参数说明 序号参数说明1pattern正则表达式中的模式字符串2repl替换的字符串,也可为一个函数3string要被查找替换的原始字符串4count模式匹配后替换的最大次数,必须是非负整数。默认值为0,表示替换所有的匹配项5flags编译时用的匹配模式,数字形式例如: >>>import re >>>phone = "139-0731-8899 #这是张山的手机号码" >>>number1 = re.sub(r'#.*$', "", phone) #删除注释 >>>print ("手机号码:", number1) >>>number2 = re.sub(r'\D', "", phone) #移除 展开更多...... 收起↑ 资源预览