版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《Python基础》实验报告实验项目实验7正则表达式学员姓名实验日期
实验7正则表达式一、实验目的1、掌握正则表达式的使用方法2、掌握常用的正则表达式处理函数二、单元练习(一)选择题1.匹配字符串abc,需要输入的正则表达式为(B)A.a.bcB.abcC.AbcD.abc.2.匹配以abc开头的所有字符串,需要输入的正则表达式为(C)A.abc.B.abc$C.^abcD.abc*E.abc.+F.abc?G.abc.*3.如果字符串中有*需要匹配,该输入表达式为(A)A.\*B.\\*C.*D.(*)(二)填空题运算符描述\d匹配任意数字,等价于[0-9].\D匹配任意非数字\s匹配任意空白字符,等价于[\t\n\r\f].\w匹配字母数字及下划线\W匹配非字母数字及下划线xy?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式x|y匹配x或yx*匹配0个或多个的表达式x+匹配1个或多个的表达式abc|def匹配abc或def已知字符串:abbbc则:正则表达式ab*的结果abbb已知字符串:abbbc则:正则表达式ab*?的结果a三、课堂练习任务1:【案例1:正则表达式进行网页解析】案例背景:已知某一网站的网页部分内容如下所示,该网页内容存储到本机D:/web.txt。要求:请解析出上述网页中所有以https开头的url,并输出。12345678910111213<divclass="top-nav-websiteapp"><ahref="/w/app?channel=top-nav"class="lnk">下载某某网站客户端</a><divid="top-nav-appintro"class="more-items"><pclass="appintro-title">某某网站</p><pclass="slogan">我们的部落格</p><divclass="download"><aref="/redirect?download=iOS">iPhone</a><span>•</span><ahref="/redirect?download=Ad">Android</a></div></div></div>getUrls.py代码如下:1234567importref=open('test.txt','r')web=f.read()urls=re.findall('https://.*?"',web)f.close()forurlinurls:print(url)案例说明:第1行,导入re模块,re模块使Python语言拥有全部的正则表达式功能。第2行,调用文件的open方法,打开web.txt。第3行,将web.txt中的文本内容读取出来,赋值给web变量。第3行,这里用了re模块,它提供Perl风格的正则表达式模式。利用findall函数获取字符串web中所有匹配的字符串。匹配格式为:https://.*?"。https://开头表示以https://为前缀文本。点(.)匹配任意除换行符“\n”外的字符。星号(*)表示匹配前一个字符0次或无限次。星号(*)后跟问号(?)表示非贪婪匹配,即尽可能少的匹配,如*?重复任意次,但尽可能少重复。三个符号组合(.*?)表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。如:a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。因此,https://.*?"表示以http://开始,以双引号(“)结束的字符串,而且要求匹配重复最少的。上例中首先匹配到/w/app?channel=top-nav",所以不再匹配href="/w/app?channel=top-nav"class=",虽然class=后面也有双引号(“),但是因为是非贪婪模式,所以选择第一次匹配成功的那个。即/w/app?channel=top-nav"。以上实例执行结果:/w/app?channel=top-nav"/redirect?download=iOS"/redirect?download=Ad"任务2:【案例2:正则表达式在数据清洗中应用】已知:某网址/中有各类电影市场票房信息,网页样本moviesample.htm保存于已知目录中,分析网页样本文件。综合利用正则表达式和字符串处理算法,截取票房概况表格信息。
电影名称总场次/占比网票票房A票房B票房C票房D票房实时(不含预售)预计累积某某历险记9.16万/27.1%1166.11万120.12万660.33万50.24万30.63万2888.85万6827.81万8.61亿某某传奇6.43万/25%1271.97万0725.72万024.28万3114.63万8110.94万4.1亿……………………moviesample.html部分代码如下:123456789101112131415161718<tableclass="table"><thead><tr><th>电影名称</th><th>总场次/占比</th><th>网票票房</th><th>A票房</th><th>B票房</th><th>C票房</th><th>D票房</th><th>实时(不含预售)</th><th>预计</th><th>累积</th></tr></thead><tbody><trclass="odd"><td><ahref="/film/8080/boxoffice"title="某某历险记">某某历险记</a></td><td>9.16万/27.1%</td><td>1166.11万</td><td>0</td><td>660.33万</td><td>0</td><td>30.63万</td><td>2888.85万</td><td>6827.81万</td><td>8.61亿</td></tr><trclass="even"><td><ahref="/film/8080/boxoffice"title="某某传奇">某某传奇</a></td><td>6.43万/25%</td><td>1271.97万</td><td>0</td><td>725.72万</td><td>0</td><td>24.28万</td><td>3114.63万</td><td>8110.94万</td><td>4.1亿</td></tr>……此处省略,结构与上方<tr></tr>基本相同,电影数据不同<trclass="even"><tdclass="right"colspan="10"><spanclass="des">以上数据仅供参考</span></td></tr></tbody></table>movie.py代码如下:123456789101112131415161718192021222324252627importreimportosimportsysimporturllib.requestBOR_amount=0.0p_path=sys.path[0]#获取当前路径url='file:'+p_path+'/moviesample.htm' #得到网页所在路径req=urllib.request.Request(url,headers={'User-Agent':"MagicBrowser"})webpage=urllib.request.urlopen(req)strw=webpage.read().decode("utf-8")s=strw.find("电影名称</th><th>总场次/占比")e=strw[s:].find("以上数据仅供参考")strw_table=strw[s:s+e]m=[]reStr="""<trclass="[a-z]{3,4}"><td><ahref="http://58921.com/film/[0-9]+/boxoffice"title=.+</tr>"""m=re.findall(reStr,strw_table)ifnotm:os._exit(0)fortinm:ss=[]ss=re.findall(r'(\d+[\.]?\d*[%]?[^\x00-\xff]*)',t)ifss:BOR_amount+=float(ss[-3].replace('万',''))else:print("出错了!")print("票房总额是:"+str(BOR_amount))以上实例执行结果:票房总额是:6003.48案例说明:第2行,导入os模块,os模块包含普遍的操作系统功能。本案例中第19行将待用os._exit()会直接将python程序终止,之后的所有代码都不会继续执行。exit(0):无错误退出第3行,导入sys模块,os模块提供了一系列有关Python运行环境的变量和函数。本案例中第6行调用sys.path[0],获取当前movie.py所在目录。第4行,导入urllib.request模块,为后续获取页面做准备。urllib.request模块提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起过程。第7行,url='file:'+p_path+'/moviesample.htm'得到网页所在完整路径。第8行,使用request()来包装请求,再通过urlopen()获取页面。req=urllib.request.Request(url,headers={'User-Agent':"MagicBrowser"})
urllib.request.Request的基本语法如下:
urllib.request.Request(url,data=None,headers={},method=None)
其中,headers(头部信息)可以携带如下信息:浏览器名和版本号、操作系统名和版本号、默认语言等等。UserAgent存放于Headers中,服务器就是通过查看Headers中的UserAgent来判断是谁在访问。
有些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果发现是爬虫程序,它就不会让你继续访问,所以程序需要隐藏自己的爬虫程序的身份。此时,我们可以通过设置UserAgent(用户代理)的来达到隐藏身份的目的。第9行,webpage=urllib.request.urlopen(req),直接调用urllib.request模块中的urlopen()获取页面。urlopen返回对象提供方法描述read(),readline(),readlines(),fileno(),close()对HTTPResponse类型数据进行操作。info()返回HTTPMessage对象,表示远程服务器返回的头信息。getcode()返回Http状态码。如果是http请求,200请求成功完成;404网址未找到geturl()返回请求的url。第10行,webpage.read()的数据格式为bytes类型,需要decode("utf-8"))解码,转换成str类型。第11行,strw.find()利用find方法找到对应字符所在的位置。返回的是在字符串strw中的起始位置,是个索引值。第11行中的s得到开始的位置,第12行中的e得到的是结束的位置。第13行中strw_table=strw[s:s+e]通过字符串截取的方式完成了从茫茫html代码中找到需要进行分析的那部分内容。数据范围都已经准备妥当,接下来要进行第一次数据过滤,第17行利用re.findall()找到符合条件的那部分数据,符合条件的数据将放到列表m中。条件就是第15-16行定义的规则表达式。规则如下:
<trclass="[a-z]{3,4}"><td><ahref=/film/[0-9]+/boxoffice"title=.+</tr>
其中,
(1)[a-z]{3,4}表示由a到z字母中任意3到4个组成的字符串。这样class="odd"和class="even"就满足条件。
(2)[0-9]+表示由多个0到9的数字构成的字符串。
(3).+表示匹配任意多个字符。这样,程序将向后继续匹配,直到找到</tr>位置。
.表示匹配除"\n"之外的任何单个字符。
+表示前一个字符匹配一次或者多次。
定位到的html结构示例:<trclass="odd"><td><ahref="/film/8080/boxoffice"title="某某历险记">某某历险记</a></td><td>9.16万/27.1%</td><td>1166.11万</td><td>0</td><td>660.33万</td><td>0</td><td>30.63万</td><td>2888.85万</td><td>6827.81万</td><td>8.61亿</td></tr>第18-19行,如果匹配不到,则程序正常退出。第20行,列表m中已经有多条类似于html结构示例中的数据,用for语句进行遍历,第22行,执行ss=re.findall(r'(\d+[\.]?\d*[%]?[^\x00-\xff]*)',t),对m列表中的每一项进行过滤。现对\d+[\.]?\d*[%]?[^\x00-\xff]*进行分析:
(1)\d+表示一到多个数字
(2)[\.|/]?表示一个小数点或者一个除号,?表示前面这部分是可选的。注意这里的\.表示这个点为字符点(.),而不是正则表达式中的匹配模式(.)
(3)\d*表示0到多个数字
(5)[%]?表示0到多个%。
(6)[^\x00-\xff]*:^表示以...开头,\x00-\xff表示英文字符和数字的编码范围。*表示前面这部分0到多个。
综上所述,满足条件的可以是整数、小数、带百分号的数、后方有字符(含中文字符)的数。
上例中经过正则表达式过滤后得到如下结果的数据:['8080','9.16万','27.1%','1166.11万','120.12万','660.33万','50.24万','30.63万','2888.85万','6827.81万','8.61亿']['8080','6.43万','25%','1271.97万','0','725.72万','0','24.28万','3114.63万','8110.94万','4.1亿']…..由于篇幅原因,只展示部分数据第23、24行,获取列表ss中票房数据,其中ss[-3]为票房数据,float(ss[-3].replace('万',''))表达式先去除中文字符(万),然后转换成浮点型进行求和,算出票房票房总额任务3:【正则表达式基本训练】现需要将字符串:phone=“123-456-789”表达为:电话号码:123456789,打印出所需要的代码。程序编写于下方importreurl1='http://123./qwerty.js'url2='/asdfgh.js?version=1'geturl1=re.findall(r'ht
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 礼仪教育:礼仪的重要性小学主题班会课件
- 2026年甘肃省玉门市高一化学上册期末考试模拟测试卷及完整答案(历年真题)
- 2026年安徽省巢湖市高一化学上册期末考试模拟卷【夺冠】附答案
- 2026年福建省福安市高一化学上册期末考试模拟检测卷及参考答案【综合卷】
- 2026年福建省福安市高一化学上册期末考试模拟卷附完整答案【有一套】
- 心理咨询师来访记录填写标准化指导书
- 家庭教育指导师亲子教育技巧指导书
- 2026年广东省雷州市高一化学上册期末考试模拟检测卷【含答案】
- 环保出行:绿色校园我做主小学主题班会课件
- 企业关键业务中断应对预案
- 2025年河北省地理生物会考真题试卷(+答案)
- 2026年高考生物试题及答案(山东卷)
- 部编版道法六年级下册第3课《学会反思》(第1课时)课件
- 《企业会计准则第21号-租赁》应用指南(2023年)
- 2026年新版八年级下学期道德法治核心知识点资料
- 2025安徽五蒙高速公路开发有限公司劳务派遣人员招聘64人笔试历年备考题库附带答案详解
- 设备维修安全管理制度
- 月子餐饮食知识培训课件
- 巫术介绍教学课件
- 2026年安徽书记员考试试题真题
- 肩关节疼痛课件
评论
0/150
提交评论