Python程序设计基础及实践(慕课版 第2版)课件 郭炜 8. 文件读写 -16. 面向对象程序设计_第1页
Python程序设计基础及实践(慕课版 第2版)课件 郭炜 8. 文件读写 -16. 面向对象程序设计_第2页
Python程序设计基础及实践(慕课版 第2版)课件 郭炜 8. 文件读写 -16. 面向对象程序设计_第3页
Python程序设计基础及实践(慕课版 第2版)课件 郭炜 8. 文件读写 -16. 面向对象程序设计_第4页
Python程序设计基础及实践(慕课版 第2版)课件 郭炜 8. 文件读写 -16. 面向对象程序设计_第5页
已阅读5页,还剩412页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息科学技术学院1

实用Python程序设计文件读写信息科学技术学院2文本文件读写信息科学技术学院郭炜德国菲森新天鹅堡文本文件读写文本文件读写概述open函数打开文件,将返回值放入一个变量,例如f用f.write函数写入文件用f.readlines()函数读取全部文件内容用f.readline()函数读取文件一行用f.close()函数关闭文件用f.read()读取全部文件内容。返回一个字符串,包含文件全部内容4文本文件读写创建文件并写入内容a=open("c:\\tmp\\t.txt","w")#文件夹c:\tmp必须事先存在,open不会创建文件夹

#"w"表示写入,用此种方式打开文件,若文件本来存在,就会被覆盖a.write("good\n")a.write("好啊\n")a.close()运行后文件c:\tmp\t.txt内容:good好啊5文本文件读写读取现有文件f=open("c:\\tmp\\t.txt","r")#"r"表示读取lines=f.readlines()#每一行都带结尾的换行符"\n"f.close()#lines是个字符串列表,每个元素是一行forxinlines:print(x,end="")输出:good好啊6文本文件读写读取现有文件#不用readlines也行f=open("c:\\tmp\\t.txt","r",encoding="utf-8")forxinf:print(x,end="")f.close()7文本文件读写用readline读文件中的一行infile=open("c:\\tmp\\t.txt","r")whileTrue:data1=infile.readline()#data1带结尾的换行符"\n"。空行也有一个字符,就是"\n" ifdata1=="":#此条件满足就代表文件结束

breakdata1=data1.strip()#去掉两头空格,包括结尾的"\n"print(data1)infile.close()8文本文件读写如果要读取的文件不存在会引发异常:try:f=open("c:\\tmp\\ts.txt","r")#若文件不存在,会产生异常,跳到except后面执行lines=f.readlines()

f.close()forxinlines:print(x,end="")exceptExceptionase:print(e)#>>[Errno2]Nosuchfileordirectory:'c:\\tmp\\ts.txt'9文本文件读写添加文件内容:f=open("c:\\tmp\\t.txt","a")#"a"要打开文件添加内容。若文件本来不存在,就创建文件f.write("新增行\n")f.write("ok\n")f.close()good好啊新增行ok文件打开模式"r":文本文件读"rb":二进制文件读"w":文本文件写"wb":二进制文件写"r+":文本文件既读又写"rb+":二进制文件既读又写文本文件的编码信息科学技术学院郭炜威尼斯文本文件的编码常见编码有gbk和utf-8两种。打开文件时如果编码不对,则不能正确读取文件.ANSI对应gbk写入文件时,如果不指定编码,则用操作系统的缺省编码Windows:gbk,可能从win10开始是utf-8Linux,MacOs:utf-8python程序的编码.py文件必须存成utf-8格式,才能运行如果存成ansi格式,则应该在文件开头写:#coding=gbkprint("你好")文本文件的编码创建文件和读取文件时都可以指定编码outfile=open("c:\\tmp\\t.txt","w",encoding="utf-8")#若打开文件用于写入时不指定编码,则使用系统缺省编码,win10下也可能是Ansi(gbk)outfile.write("这很好ok\n")

outfile.write("这ok")

outfile.close()

infile=open("c:\\tmp\\t.txt","r",encoding="utf-8")

lines=infile.readlines()

infile.close()

forxinlines:

print(x.strip())文本文件的编码gbk编码的文件,如果用encoding="utf-8"来open,可能会产生异常。utf-8编码的文件,如果用encoding="gbk"来open,不会产生异常,但是用read或readline,readlines读取到的信息会乱码。信息科学技术学院郭炜文件的路径瑞士少女峰open文件名参数的相对路径形式和绝对路径形式相对路径形式:文件名没有包含盘符open("readme.txt","r")

文件在当前文件夹(当前路径)下open("tmp/readme.txt","r") "/"写成"\\"效果也一样

文件在当前文件夹下的tmp文件夹里面open("tmp/test/readme.txt","r")

文件在当前文件夹下的tmp文件夹里面的test文件夹下面open("../readme.txt","r")

文件在当前文件夹的上一层文件夹里面open("../../readme.txt","r")

文件在当前文件夹的上两层文件夹里面open("../tmp2/test/readme.txt","r")

文件在当前文件夹的上一层的tmp2文件夹的test文件夹里面

tmp2和当前文件夹是平级的open("/tmp3/test/readme.txt","r")

文件在当前盘符的根文件夹下的tmp3/test/里面open文件名参数的相对路径形式和绝对路径形式绝对路径形式:文件名包含盘符open("d:/tmp/test/readme.txt","r")路径也叫文件夹,或者目录(path,folder,directory)Python程序的“当前文件夹(当前路径,当前目录)”程序运行时,会有一个“当前文件夹”,open打开文件时,如果文件名不是绝对路径形式,则都是相对于当前文件夹的。一般情况下,.py文件所在的文件夹,就是程序运行时的当前文件夹。在Pycharm里面运行程序,就是如此。程序可以获取当前文件夹:importosprint(os.getcwd())

#os.getcdw()获取当前文件夹#>>c:\tmp5\testPython程序的“当前文件夹(当前路径,当前目录)”在命令行方式运行程序时,cmd窗口的当前文件夹,就是程序的当前文件夹,不论程序存在哪里。c:\tmp5\test\t1.py如下:importosprint(os.getcwd())

则:命令提示符Python程序的“当前文件夹(当前路径,当前目录)”程序运行期间可以改变当前文件夹c:\tmp5\test\t1.py如下:importosprint(os.getcwd())os.chdir("c:/tmp")print(os.getcwd())则:信息科学技术学院郭炜文件夹操作祁连山Python的文件夹操作函数os库和shutil库中有一些函数可以用来操作文件和文件夹(文件夹也称为“目录”)os.chdir(x)将程序的当前文件夹设置为xos.getcwd()求程序的当前文件夹os.listdir(x)返回一个列表,里面是文件夹x中的所有文件和子文件夹的名字os.mkdir(x)创建文件夹xos.path.exists(x)判断文件或文件夹x是否存在os.path.getsize(x) 获取文件x的大小(单位:字节)os.path.isfile(x)判断x是不是文件os.remove(x)删除文件xos.rmdir(x)删除文件夹x。x必须是空文件夹才能删除成功os.rename(x,y)将文件或文件夹x改名为y。不但可以改名,还可以起到移动文件或文件夹的作用。例如,os.rename("c:/tmp/a","c:/tmp2/b")可以将文件夹或文件"c:/tmp/a"移动到"c:/tmp2/"文件夹下面,并改名为b。前提是tmp2必须存在。shutil.copyfile(x,y)拷贝文件x到文件y。若y本来就存在,会被覆盖Python的文件夹操作函数删除文件夹的递归函数:(不要随便试,用它删除了文件夹就不能恢复)importosdefpowerRmDir(path):#连根删除文件夹pathlst=os.listdir(path) forxinlst:actualFileName=path+"/"+x #x不包括路径,例如a.txtifos.path.isfile(actualFileName):#actualFileName是文件os.remove(actualFileName)else:powerRmDir(actualFileName)#actualFileName是文件夹os.rmdir(path)powerRmDir("c:/tmp/ttt")powerRmDir("tmp/ttt")#删除当前文件夹下的tmp文件夹下的ttt文件夹Python的文件夹操作函数获取文件夹总大小的递归函数importosdefgetTotalSize(path):total=0lst=os.listdir(path)forxinlst:actualFileName=path+"/"+x#x不包括路径ifos.path.isfile(actualFileName):total+=os.path.getsize(actualFileName)else:total+=getTotalSize(actualFileName)returntotal文件处理实例信息科学技术学院郭炜美国纪念碑谷程序1:统计文章中的单词词频程序名:countfile.py用命令行方式启动该程序:pythoncountfile.py对"源文件"进行单词词频(出现次数)分析,分析结果写入"结果文件",单词按照字典序排列28程序1:统计文章中的单词词频文章文件a1.txt的格式:Whenmanycouplesdecidetoexpandtheirfamily,theyoftentakeintoconsiderationthedifferentgenetictraitsthattheymaypassontotheirchildren.Forexample,ifsomeonehasahistoryofheartproblems,theymightbeconcernedaboutpassingthatontotheirchildrenaswell.TreacherCollinssyndrome,orTCS,?isararefacialdisfigurementthatgreatly:slows:thedevelopmentofbonesandothertissuesthatmakeupthehumanface.Asaresult,mostpeopleliving?withTCShave?underdevelopedcheekbones,asmalljaw,andanundersizedchin.29程序1:统计文章中的单词词频统计的结果结果文件r1.txt格式a 8about 2an 1and 4are 1around 1as 2backlash 1be 430程序1:统计文章中的单词词频思路:要从源文件中分割出单词,然后用字典记录单词的出现频率。用文件对象的read函数读取全部内容到一个字符串,然后分割单词。31程序2:统计多个文件累计单词频率程序名countfiles.py:用法:pythoncountfiles.py对当前文件夹(countfiles.py文件所在文件夹)下全部文件名是字母a打头的.txt文件进行词频统计,统计的总的结果写入"结果文件"result.txt32程序2:统计多个文件累计单词频率思路:要获得.py

程序所在文件夹下的所有a打头,.txt结尾的文件。对每个文件,调用上面程序1的处理单个文件的函数进行处理importos

#python自带os

库os.listdir()可以获得当前文件夹下所有文件和文件夹的列表。列表中元素是文件或文

件夹名字,不带路径(目录)os.path.isfile(x)可以判断x是不是一个文件(文件夹不是文件)33程序2:统计多个文件累计单词频率os.listdir示例假设c:\tmp文件夹下有文件t.py,

a.txt,b.txt和文件夹hello程序t.py如下:importosprint(os.listdir())则运行t.py输出结果为:['a.txt','b.txt','hello','t.py']34程序2:统计多个文件累计单词频率实现:result={}lst=os.listdir()#列出当前文件夹下所有文件和文件夹的名字forxinlst:ifos.path.isfile(x):#如果x是文件

ifx.lower().endswith(".txt")andx.lower().startswith("a"):#x是'a'开头,.txt结尾

countFile(x,result)#countFile是程序1中统计一个文件的函数35程序3:准确统计文章中的单词词频程序名:countfile_novary.py用法:pythoncountfile_novary.py对"源文件"进行单词词频分析,分析结果写入结果文件如果碰到单词的变化形式,则转换成原型再统计单词原型-变化词汇表在文件word_varys.txt里面,格式:act

acted|acting|actsaction actionsactive

actively|activeness36程序3:准确统计文章中的单词词频思路1)同样需要一个字典来统计单词及其出现次数。2)读取word_varys.txt文件,构造一个字典dt。元素形式为:{acted:act,acting:act,acts:act,actions:action,}键是单词的变化形式,值是单词的原型。3)对每个“源文件”里的单词w,查找dt中键为w的元素x。如果x不存在,则w就是原型,统计其词频。如果x存在,则值x[1]是原型,将x[1]的出现次数加1。37程序4:countfile_nocet4.py程序名:countfile_nocet4.py用法:pythoncountfile_nocet4.py对源文件进行单词词频分析,只抽取不在四级单词列表中的单词,将分析结果写入"结果文件"四级单词列表在文件cet4words.txt中,单词都是单独一行,以$打头$a[e?]art.一(个);每一(个)$abandon[?'b?nd?n]vt.遗弃;放弃;放纵(自己)38程序4:countfile_nocet4.py思路:读取cet4words.txt中的单词,存放到一个集合里面。碰到源文件里的单词,先查查在不在集合里面,如果在,则抛弃。39信息科学技术学院40

实用Python程序设计Python数据库编程信息科学技术学院郭炜41数据库和SQL信息科学技术学院黄山数据库的概念数据库可以用来存放大量数据,并且提供了方便的快速检索手段便于快速找出符合某种条件的数据。比如:工作年限超过三年,工资超过10000元的北京籍员工一个数据库可以是一个文件,比如c:/tmp/students.db数据库中的表一个数据库文件里可以有多张表。比如students.db

里包含"学生信息表"和"课程信息表"表由记录构成,比如“学生信息表”里的每个记录,代表一个学生的信息。记录由字段构成,描述一个事物的多个属性。比如学生记录,可以由name,id,age,gender,gpa

等字段构成字段

字段是有"类型"的。比如字段名

数据类型name text 字符串gpa real 小数age integer 整数profile text photo blob 二进制数据(如图片)birthday date 日期(本质上就是text)registertime datetime

日期+时间(本质上就是text)46SQL数据库查询语句参考:/sql/sql_syntax.aspSQL命令:用于进行数据库操作的标准语句CREATETABLE 创建表INSERTINTO 在表中插入记录UPDATE 在表中更新记录SELECT 在表中进行查询DELETE 从表中删除记录不区分大小写47CREATECREATETABLEifnotexistsstudents(idintegerprimarykey,

nametext,gpareal,birthdaydate,ageinteger,pictureblob)创建了一张名为students的表,有以下字段:字段名

数据类型id integer primarykey表示不可重复name text 字符串gpa real 小数birthday date 日期(本质上就是text)age integer 整数picture blob 二进制数据(如图片)48INSERTINSERTINTOstudentsVALUES(1000,'张三',3.81,'2000-09-12',18,null)在表students中插入一个记录,该记录暂无照片(null)VALUES(每个字段的值)创建数据库信息科学技术学院长城入海处:老龙头创建数据库并写入数据importsqlite3db=sqlite3.connect("c:/tmp/test2.db")#连接数据库,若不存在则自动创建#文件夹c:/tmp必须事先存在,connect不会创建文件夹cur=db.cursor()#获取光标,要操作数据库一般要通过光标进行sql='''CREATETABLEifnotexistsstudents(idintegerprimarykey,nametext,gpareal,birthdaydate,ageinteger,pictureblob)'''#如果表students不存在就创建它cur.execute(sql)#执行SQL命令cur.execute("insertintostudentsvalues(1600,'张三',3.81,'2000-09-12',18,null)")#插入一个记录mylist=[(1700,'李四',"3.25",'2001-12-01',17,None),(1800,'王五',"3.35",'1999-01-01',19,None)]forsinmylist:#依次插入mylist中的每个记录cur.execute('INSERTINTOstudentsVALUES(?,?,?,?,?,?)',(s[0],s[1],s[2],s[3],s[4],s[5]))#?对应于后面某项mit()#真正写入,写入操作都需要这个cur.close()#关闭光标db.close()#关闭数据库数据库的查询和修改信息科学技术学院云岗石窟52SELECTSELECT*FROMstudents

检索students表中全部记录SELECT*FROMstudentsORDERBYage

检索students表中全部记录,并按年龄排序SELECTname,ageFROMstudents检索students表中全部记录,但每个记录只取name和age字段SELECT*FROMstudentsWHEREname='张三'检索students表中全部name字段为张三的记录WHERE表示检索条件SELECT*FROMstudentsWHEREname='张三'ANDage>20ORDERBYage

DESC

检索students表中全部名为张三且年龄大于20的人,结果按年龄降序排列检索数据库importsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql='select*fromstudents'#检索全部记录cur.execute(sql)x=cur.fetchone()#fetchone取满足条件的第一条记录print(x) #=>(1600,'张三',3.81,'2000-09-12',18,None)print(x[1]) #=>张三forxincur.fetchall():#fetchall取得所有满足条件的记录

print(x[:-2])#age和picture字段不打出cur.execute("SELECT*FROMstudentsWHEREname='Jack'")x=cur.fetchone()ifx==None:print("can'tfindJack")cur.close()db.close()(1600,'张三',3.81,'2000-09-12',18,None)张三(1700,'李四',3.25,'2001-12-01')(1800,'王五',3.35,'1999-01-01')can'tfindJack检索数据库importsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql='selectname,gpa,agefromstudentswheregpa>3.3orderbyagedesc'#查找gpa>3.3的记录,题取其中三个字段,按年龄降序排列cur.execute(sql)x=cur.fetchall()ifx!=[]:print("total:",len(x))#=>2forrinx:print(r)cur.close()db.close()total:2('王五',3.35,19)('张三',3.81,18)55UPDATEUPDATEstudentsSETgpa=3.9将所有记录的gpa设置成3.9

UPDATEstudentsSETgpa=3.9,age=18WHEREname='李四'

修改李四的gpa和年龄56UPDATEimportsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql='UPDATEstudentsSETgpa=?,age=?WHEREname=?'cur.execute(sql,(4.0,20,'李四'))#元组三个元素分别对应三个?#修改李四的gpa和年龄。若李四不存在,则无效果mit()#写入操作必须cur.close()db.close()57DELETEDELETEFROMstudentsWHEREage<18

删除年龄小于18的记录

DELETEFROMstudents

删除全部记录别忘了最后commit58DROPTABLEDROPTABLEIFEXISTSstudents

删除students表别忘了最后commit59DROPTABLEimportsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()cur.execute("DROPTABLEIFEXISTSstudents")mit()try:cur.execute("select*fromstudents")x=cur.fetchall()forrinx:print(r[:-1])except:print("notable")#=>notablecur.close()db.close()60列出数据库中所有的表和表的结构importsqlite3db=sqlite3.connect("c:/tmp/test3.db")cur=db.cursor()sql='CREATETABLEifnotexiststable2(idinteger,nametext)'cur.execute(sql)#执行SQL命令sql='CREATETABLEifnotexiststable1(idinteger,schooktext)'cur.execute(sql)mit()cur.execute('selectnamefromSQLITE_MASTERwheretype="table"orderbyNAME')x=cur.fetchall()ifx!=[]:print(x)cur.execute("PRAGMATABLE_INFO(table1)")print(cur.fetchall())cur.close()db.close()[('table1',),('table2',)][(0,'id','integer',0,None,0),(1,'schook','text',0,None,0)]61注意事项对于修改表的操作,如插入,删除,更新,关闭数据库前不要忘了commit,否则

可能无效2.必要时用try...except语句来避免数据库不存在,表不存在时的导致的runtimeerror处理二进制字段信息科学技术学院大连金石滩63设置blob字段(二进制字段)的值:importsqlite3importrequestsf=open('c:/tmp/tmp.jpg','rb')#二进制方式打开图片img=f.read()f.close()db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql="UPDATEstudentsSETpicture=?WHEREname='李四'"cur.execute(sql,(img,))#设置李四的照片。img对应于?64设置blob字段(二进制字段)的值:imgUrl="/uploads/item/201605/19/20160519224441_VfMWR.jpeg"#从网络获取图片imgStream=requests.get(imgUrl,stream=True)sql="UPDATEstudentsSETpicture=?WHEREname='张三'"cur.execute(sql,(imgStream.content,))#设置张三的照片。#imgStream.content对应于?mit()cur.close()db.close()65读取blob字段(二进制字段)的值:importsqlite3importrequestsdb=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql="selectname,picturefromstudentsWHEREname='张三'orname='李四'"cur.execute(sql)x=cur.fetchall()forrinx:#r[0]是姓名,r[1]是图片文件数据f=open("c:/tmp/"+r[0]+".jpg","wb")#照片写入张三.jpg和李四.jpgf.write(r[1])f.close()cur.close()db.close()信息科学技术学院66

实用Python程序设计正则表达式信息科学技术学院67可以用来判断某个字符串是否符合某种模式,比如判断某个字符串是不是邮箱地址,网址,电话号码,身份证号……可以用来在文本中寻找并抽取符合某种模式的字符串,比如电子邮件地址,电话号码,网址,身份证号……,找出三国演义中所有孔明提到曹操的场合都说了些啥。正则表达式正则表达式的

基本概念和构成信息科学技术学院郭炜加拿大班芙国家公园正则表达式是个某些字符有特殊含义字符串,表示一种字符串的模式(格式),如:"abc" 匹配"abc""b.?p.*k" 匹配"bapk","bpabk"..."\d{3}[a-zA-Z]+.(\d{2}|N/A)\s\1"匹配????可以用相关函数求给定字符串和正则表达式的匹配情况正则表达式字符/组合匹配的模式正则表达式匹配的字符串.除'\n'外的任意一个字符,包括汉字(多行匹配方式下也能匹配'\n')'a.b''acb''adb''a(b'*量词。表示左边的字符可出现0次或任意多次'a*b''b''ab''aaaab'?量词。表示左边的字符必须出现0次或1次'ka?b''kb''kab'+量词。表示左边的字符必须出现1次或更多次'ka+b''kab''kaaab'{m}量词。m是整数。表示左边的字符必须且只能出现m次'ka{3}a''kaaaa'{m,n}量词。m,n是整数。表示左边的字符必须出现至少m次,最多n次。n也可以不写,表示出现次数没有上限'ka{1,3}b''kab''kaab''kaaab'正则表达式中的功能字符字符/组合匹配的模式正则表达式匹配的字符串\d一个数字字符,等价于[0-9]'a\db''a2b'a3b'\D一个非数字的字符,等价于[^\d],[^0-9]'a\Db''acb'\s一个空白字符,如空格,\t,\r,\n等'a\sb''ab''a\nb'\S一个非空白字符'a\Sb''akb'\w一个单词字符:包括汉字或大小写英文字母,数字,下划线,或其它语言的文字'a\wb'

'a_b''a中b'\W一个不是单词字符的字符'a\Wb''a?b'|A|B表示能匹配A或能匹配B均算能匹配'ab|c''ab''c'print("\\s\s\S\w\W\d\D")#python字符串中,\s等不是转义字符,都是两个字符#>>\s\s\S\w\W\d\D正则表达式中常见的特殊字符有以下几个:

.+?*$[]()^{}\

如果要在正则表达式中表示这几个字符本身,就应该在其前面加'\'。正则表达式中的特殊字符正则表达式匹配的字符串'a\$b''a$b''a\*b''a*b''a\[\]b''a[]b''a\.*b''ab''a.b''a..b''a\\\\b''a\\b'(注意:此字符串长度为3,中间那个字符是'\',即r'a\b')r'a\\b'r'a\b'(r'a\b'等价于'a\\b')

正则表达式中的特殊字符print("\*\$\.\+\[\]\(\)\?\^\{\}")#这些都不是转义字符,都是两个字符#>>\*\$\.\+\[\]\(\)\?\^\{\}范围符号[]

量词信息科学技术学院郭炜圣彼得堡炮兵博物馆范围符号[XXX]的用法用以表示“此处必须出现一个某某范围内的字符”,或者“此处必须出现一个字符,但不可以是某某范围内的字符”[XXX]的用法[a2c]匹配'a','2','c'之一's[a2c]k''sak''s2k''sck'[a-zA-Z]匹配任一英文字母'b[a-zA-Z]k'

'bak''bUk'[\da-z\?]匹配一个数字或小写英文字母或'?''b[\da-z\?]k''b0k''bck''b?k'[^abc]匹配一个非'a','b','c'之一的字符'b[^abc]k'匹配所有能匹配'b.k'的字符串,除了:'bak''bbk''bck'[^a-f0-3]匹配一个非英文字母'a'到'f',也非数字'0'到'3'的字符略略匹配汉字汉字的unicode编码范围是4e00-9fa5(16进制),因此[\u4e00-\u9fa5]即表示一个汉字print('\u4e00\u4e01\u4e88\u9fa5') #>>一丁予龥量词的用法'.+'

匹配任意长度不为0且不含'\n'的字符串。'+'表示左边的'.'代表的

任意字符出现1次或更多次。不要求出现的字符都必须一样。'.*'

匹配任意不含'\n'的字符串,包括空串'[\dac]+'

匹配长度不为0的由数字或'a',c'构成的串,如'451a','a21c78ca''\w{5}'

匹配长度为5的由字母或数字或汉字构成的串,如'高大abc', '33我a1'正则表达式示例[1-9]\d*

正整数-[1-9]\d*

负整数-?[1-9]\d*|0

整数[1-9]\d*|0

非负整数-?([1-9]\d*\.\d*[1-9]|0\.\d*[1-9]|0)

左右都没有多余0的小数\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 邮箱邮箱示例:a.b.c.ddef+sfd@正则表达式的

函数信息科学技术学院郭炜加拿大班芙国家公园使用正则表达式使用正则表达式要:importre82re.match函数re.match(pattern,string,flags=0)从字符串string的起始位置匹配一个模式patternflags标志位,用于控制模式串的匹配方式,如:是否区分大小写,多行匹配等等,如re.M|re.I

表示忽略大小写,且多行匹配成功则返回一个匹配对象,否则返回None83re.match函数importredefmatch(pattern,string):x=re.match(pattern,string)ifx!=None:print(x.group())#x.group是匹配上的字符串else:print("None")match("ac","acdkgh") #>>acmatch("abc","kabc") #>>None虽然有abc,但不是在起始位置match("a\tb*c","a\tbbcde") #>>a bbcb出现0次或任意多次,然后跟cmatch("ab*c","ac") #>>acmatch("a\d+c","ac") #>>Noneb出现1次或更多次,然后跟cmatch("a\d{2}c","a34c") #>>a34cmatch("a\d{2,}c","a3474884c")#>>a3474884cmatch(".{2}bc","cbcd") #>>Nonebc前面要有2个字符84re.match函数match(".{2}bc","bcbcdbc") #>>bcbcmatch("ab.*","ab") #>>abb后面可以没字符或任意字符match("ab.*","abcd") #>>abcdmatch("\d?b.*","1bcd") match("\d?b.*","bbcd") match("a?bc.*","abbbcd") match("a.b.*","abcd") match("a.b.*","aeb") match("a.?b.*","aebcdf") #>>aebcdf#a和b之间没字符或有任意一个字符均可match("a.+b.*","aegsfb") match("a.+b.*","abc") match("a高.+k","a高大kcd") #>>a高大k85re.match函数match(".{2}bc","bcbcdbc") #>>bcbcmatch("ab.*","ab") #>>abb后面可以没字符或任意字符match("ab.*","abcd") #>>abcdmatch("\d?b.*","1bcd") #>>1bcd 数字应出现0次或1次match("\d?b.*","bbcd") #>>bbcdmatch("a?bc.*","abbbcd") #>>None b太多了match("a.b.*","abcd") #>>Nonea和b之间必须要有一个字符match("a.b.*","aeb") #>>aebmatch("a.?b.*","aebcdf") #>>aebcdf#a和b之间没字符或有任意一个字符均可match("a.+b.*","aegsfb") #>>aegsfbmatch("a.+b.*","abc") #>>Nonematch("a高.+k","a高大kcd") #>>a高大k86re.search函数87re.search(pattern,string,flags=0)查找字符串中可以匹配成功的子串。若匹配成功,则返回匹配对象;若无法匹配,则返回None。re.search函数importredefsearch(pattern,string):x=re.search(pattern,string)ifx!=None:print(x.group(),x.span()) #输出子串及起止位置

else:print("None")search("a.+bc*","dbaegsfbcef") #>>aegsfbc(2,9)search("a.+bc*","bcdbaegsfbccc") #>>aegsfbccc(4,13)search("a.?bc*d","dabccdc") #>>abccd(1,6)search("aa","baaaa") #>>aa(1,3)search("\([1-9]+\)","ab123(0456)(789)45ab")#>>(789)(11,16)search("[1-9]\d+","ab01203d45")#>>1203(3,7)88re.findall函数89re.findall(pattern,string,flags=0)查找字符串中所有和模式匹配的子串(不重叠)放入列表。一个子串都找不到就返回空表[]re.finall函数importreprint(re.findall('\d+',"thisis334whatme774gw"))#>>['334','774']print(re.findall('[a-zA-Z]+',"Adoghas4legs.这是true"))#>>['A','dog','has','legs','true']print(re.findall('\d+',"thisisgood.")) #>>[]print(re.findall("aaa","baaaa")) #>>['aaa']90re.finditer函数91re.finditer(pattern,string,flags=0)查找字符串中所有和模式匹配的子串(不重叠),每个子串对应于一个匹配对象,返回匹配对象的序列(准确说是“可调用迭代器”)如果找不到匹配子串,返回值也不为None或空表。假设返回值为r,则list(r)为[]re.finditer函数importre s='233[32]88ab<433>(21)'m='\[\d+\]|<\d+>' #|表示'或'forxinre.finditer(m,s): #x是匹配对象

print(x.group(),x.span())i=0foryinre.finditer(m,"aaaaa"):i+=1 #不会被执行输出:[32](3,7)<433>(11,16)92分组信息科学技术学院郭炜圣彼得堡彼得霍夫宫括号中的表达式是一个分组。多个分组按左括号从左到右从1开始依次编号importrex=re.search('[a-z]+(\d+)[a-z]+',"ab123dhello553world47")print(x.group(1)) #>>553m="(((ab*)c)d)e"r=re.match(m,"abcdefg")print(r.group(0)) #>>abcde group(0)等价于group() print(r.group(1)) #>>abcdprint(r.group(2)) #>>abcprint(r.group(3)) #>>abprint(r.groups()) #>>('abcd','abc','ab')分组(...)括号中的表达式是一个分组。多个分组按左括号从左到右从1开始依次编号importrem="(ab*)(c(d))e"r=re.match(m,"abcdefg")print(r.groups()) #>>('ab','cd','d')print(r.group(0)) #>>abcdeprint(r.group(1)) #>>abprint(r.group(2)) #>>cdprint(r.group(3)) #>>d分组(...)在分组的右边可以通过分组的编号引用该分组所匹配的子串importrem=r'(((ab*)c)d)e\3' #r表示字符串里的'\'不再转义#要求ab*cde后面跟着3号分组在本次匹配中匹配上的子串r=re.match(m,"abbbcdeabbbkfg")#红色部分少一个b则不能匹配print(r.group(3)) #abbbprint(r.group()) #abbbcdeabbb分组(...)在分组的右边可以通过分组的编号引用该分组所匹配的子串pt='a(.)\\1*b'#或pt=r'a(.)\1*b'print(re.search(pt,'kacccccb').group()) #>>acccccbprint(re.search(pt,'kaxxxxb').group()) #>>axxxxbprint(re.search(pt,'kaxb').group()) #>>axbx=re.search(pt,'kaxyb')ifx!=None:print(x.group()) #不会执行分组(...)分组作为一个整体,后面可以跟量词importrem="(((ab*)+c)d)e"r=re.match(m,"ababcdefg")print(r.groups()) #>>('ababcd','ababc','ab')r=re.match(m,"abacdefg")print(r.groups()) #>>('abacd','abac','a')不要求分组的多次出现必须匹配相同字符串分组(...)在正则表达式中没有分组时,re.findall返回所有匹配子串构成的列表。有且只有一个分组时,re.findall返回的是一个子串的列表,每个元素是一个匹配子串中分组对应的内容。importrem='[a-z]+(\d+)[a-z]+'x=re.findall(m,"13bc12deab11cd320ef")print(x) #>>['12','320']re.findall和分组在正则表达式中有超过一个分组时,re.findall返回的是一个元组的列表,每个元组对应于一个匹配的子串,元组里的元素,依次是1号分组、2号分组、3号分组匹配的内容importrem='(\w+)(\w+)'r=re.match(m,"helloworld")print(r.groups()) #>>('hello','world')print(r.group(1)) #>>helloprint(r.group(2)) #>>worldr=re.findall(m,"helloworld,thisisverygood")#找出由所有能匹配的子串的groups()构成的元组,互相不重叠print(r)#>>[('hello','world'),('this','is'),('very','good')]findall和分组re.sub(模式串,替换串,母串)用于替换匹配的子串importres='abc.xyz'print(re.sub(r'(.*)\.(.*)',r'\2.\1',s)) #>>xyz.abc#用'(.*)\.(.*)'匹配s,并用'\2.\1'替换s中被匹配的子串#\2代表第2个分组匹配的内容,\1是第一个分组匹配的内容re.sub和分组|的用法信息科学技术学院郭炜圣彼得堡阿芙乐尔号巡洋舰表示“或”,如果没有放在"()"中,则起作用范围是直到整个正则表达式开头或结尾或另一个"|""\w{4}ce|c\d{3}|p\w" 可以匹配:"c773""ab12ce""pk""|"的用法从左到右短路匹配(匹配上一个后就不计算是否还能匹配后面的)importrept="\d+\.\d+|\d+"print(re.findall(pt,"12.34thisis125"))#>>['12.34','125']pt="aa|aab"print(re.findall(pt,"aabcdeaa12aab"))#>>['aa','aa','aa']"|"的用法'|'也可以用于分组中,起作用范围仅限于分组内importrem="(((ab*)+c|12)d)e"print(re.findall(m,'ababcdefgKK12deK'))#>>[('ababcd','ababc','ab'),('12d','12','')]forxinre.finditer(m,'ababcdefgKK12deK'):print(x.groups())#>>('ababcd','ababc','ab')#>>('12d','12',None)m='\[(\d+)\]|<(\d+)>'forxinre.finditer(m,'233[32]88ab<433>'):print(x.group(),x.groups())

#>>[32]('32',None)#>><433>(None,'433')"|"的用法贪婪模式

懒惰模式信息科学技术学院郭炜美国圣地亚哥中途岛号航母量词的贪婪模式107量词+,*,?,{m,n}默认匹配尽可能长的子串importreprint(re.match("ab*","abbbbk").group()) #>>abbbbprint(re.findall("<h3>(.*)</h3>", "<h3>abd</h3><h3>bcd</h3>"))#>>['abd</h3><h3>bcd']print(re.findall('\(.+\)', "Adoghas(havea).这(哈哈)true()me"))#>>['(havea).这(哈哈)true()']量词的非贪婪(懒惰)模式108在量词+,*,?,{m,n}后面加'?'则匹配尽可能短的字符串

。importrem="a.*?b"forkinre.finditer(m,"aabab"):print(k.group(),end="")#>>aababm="<h3>.*?</h3>"a=re.match(m,"<h3>abd</h3><h3>bcd</h3>")print(a.group()) #>><h3>abd</h3>m="<h3>.*?[M|K]</h3>"a=re.match(m,"<h3>abd</h3><h3>bcK</h3>")print(a.group())#>><h3>abd</h3><h3>bcK</h3>量词的非贪婪(懒惰)模式109在量词+,*,?,{m,n}后面加'?'则匹配尽可能短的字符串

。importreprint(re.findall('\d+?',"thisis334whatme774gw"))#>>['3','3','4','7','7','4']print(re.findall('[a-zA-Z]+?',"Adoghas4legs.这是true"))#>>['A','d','o','g','h','a','s','l','e','g','s','t','r','u','e']print(re.findall('\(.*?\)',"Adoghas(have).这(哈哈)true()me"))#>>['(have)','(哈哈)','()']应用实例信息科学技术学院郭炜瑞典斯德哥尔摩诸葛亮口中的曹操

找出三国演义中,在诸葛亮提到曹操的所有场景,他是怎么说的模式:孔明曰:“倘曹操引兵来到,当如之何?”孔明曰:“公瑾主意欲降操,甚为合理。”孔明答曰:“曹操乃汉贼也,又何必问?”孔明笑曰:“今操引百万之众,”:“”都是中文的111诸葛亮口中的曹操importref=open("c:/tmp/三国演义utf8.txt","r",encoding="utf-8")txt=f.read()f.close()pt="(孔明.{0,2}曰:“[^”]*(曹操|曹贼|操贼|曹阿瞒|操).*?”)"a=re.findall(pt,txt)print(len(a)) #>>58forxina:#x形如:('孔明答曰:“曹操乃汉贼也,又何必问?”','操') print(x[0])112抽取ip地址、邮箱、网址importreipadr=r"\b((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\b"mailbox=r"\b[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+\b"url=r'http://[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(/[-a-zA-Z0-9]+)*\b's="Myipis,thisis/python/new,mymailboxisguo_wei@.ok?"m=re.search(ipadr,s)ifm!=None:print(m.group())#>>113抽取ip地址、邮箱、网址m=re.search(mailbox,s)ifm!=None:print(m.group()) #>>guo_wei@forxinre.finditer(url,s):print(x.group())#>>/python/new114简化正则表达式的编写一般来说,要写一个精确的正则表达式,比如写一个正则表达式来匹配ip地址,要做到匹配它的字符串一定是ip地址,且ip地址一定能匹配它,是比较困难的。正则表达式可以写得宽容一些,即ip地址一定能匹配它,但是能匹配它的不一定是ip地址。对匹配的字符串,另外再做一些额外的判断排除掉非ip地址,这样做比写精确的正则表达式容易。例如:'\d+\.(\d{1,3}\.){2}\d+'然后再split以后手动判断每一段是不是都小于255115信息科学技术学院116

实用Python程序设计玩转Python生态信息科学技术学院117使用Python的库信息科学技术学院

郭炜美国黄石公园Python自带的库

math,re,datetime,turtle,random

无数第三方的库

Pillow,jieba,request,matplotlib

119Python的库进入cmd命令行窗口进入安装Python的文件夹,默认通常是: C:\Users\你的用户名\AppData\Local\Programs\Python\Python37

不知道的话查找python.exe可以找到3)再进入scripts文件夹4)pipinstall库名120安装Python第三方库菜单:File|Settings121Pycharm中安装Python第三方库2.点这里1.选这里122Pycharm中安装Python第三方库2.点这里1.输入库名,回车importturtle #turtle是一个类turtle.setup(800,600)turtle.fd()或:importturtleastt #此后tt等价于turtlett.setup(800,600)tt.fd(100)123用import导入库importPIL.Image#PIL.Image是类中的类img=PIL.Image.open("c:/tmp/pic/grass.jpg")#将图像文件载入对象imgimg.show()或:fromPILimportImage

#从PIL库导入Image类进行图像处理img=Image.open("c:/tmp/pic/grass.jpg")#将图像文件载入对象img124import的用法importPIL.Image,PIL.ImageDraw,PIL.ImageFontimg=PIL.Image.open("c:/tmp/pic/grass.jpg")#将图像文件载入对象imgdraw=PIL.ImageDraw.Draw(img)#以后就可以通过draw在img上画图、写字myFont=PIL.ImageFont.truetype("C:\\Windows\\Fonts\\simhei.ttf",164)或fromPILimportImage,ImageDraw,ImageFontimg=Image.open("c:/tmp/pic/grass.jpg")#将图像文件载入对象imgdraw=ImageDraw.Draw(img)#以后就可以通过draw在img上画图、写字myFont=ImageFont.truetype("C:\\Windows\\Fonts\\simhei.ttf",164)125import的用法fromopenpyxl.stylesimportFont,colors,AlignmentboldRedFont=Font(size=18,name='TimesNewRoman',bold=True,color=colors.RED)alignment=Alignment(horizontal='left',vertical='center')126import的用法用datetime库

处理日期、时间信息科学技术学院

郭炜阳朔遇龙河importdatetime#导入datetime模块dtBirth=dateti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论