Python程序设计基础项目化教程 课件 项目十一 Python 爬虫基础_第1页
Python程序设计基础项目化教程 课件 项目十一 Python 爬虫基础_第2页
Python程序设计基础项目化教程 课件 项目十一 Python 爬虫基础_第3页
Python程序设计基础项目化教程 课件 项目十一 Python 爬虫基础_第4页
Python程序设计基础项目化教程 课件 项目十一 Python 爬虫基础_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

《Python语言程序设计》项目十一Python爬虫基础Contents了解爬虫概念掌握如何解析复杂HTML页面掌握正则表达式的基础语法掌握re模块的使用认识爬虫PART01Web爬虫的基本概念Web爬虫=Webcrawler=Webspider=WebrobotWeb爬虫是一种自动地、有条理地下载Web页面的程序。Web爬虫用于获取最新的Web数据。认识爬虫为什么要使用Web爬虫?Web信息处理(如关键词搜索等)需要用到两类数据:1、超文本文档2、超文本文档间通过超链接构成的Web图(WebGraph)获取这两类数据非常困难!数量巨大、带宽有限、服务器控制、动态更新认识爬虫直观的解决方案从若干网页开始,分析其中所包含的超链接,然后获取这些链接所指向的页面,此过程不断迭代执行,直至获取了全部页面为止。Web信息获取=Web图的遍历广度优先搜索(BFS)深度优先搜索(DFS)认识爬虫简单遍历方法的不足BFS的缺点:

网页访问局部性差

网络通信开销大DFS的缺点: Web服务器负载重

吞吐率低 Web数据获取程序易落入“陷阱”原因:未考虑网络通信资源的约束认识爬虫Web爬虫的主要应用搜索引擎

Web爬虫自动下载搜索引擎所需的网页; 搜索引擎分析这些网页并建立索引。信息内容安全

Web爬虫自动下载最新的网页; 检查这些网页是否包含特定关键词。信息搜集

Web爬虫自动下载最新的网页; 提取这些网页中包含的Email地址。认识爬虫Web爬虫的基本工作原理认识爬虫Web爬虫的基本工作原理初始化在优先级队列中加入起始URL地址D1,…,Ds页面获取从优先级队列中取出地址Di从地址Di获取页面P(Di)解析页面P(Di)中的超链接和网页信息将P(Di)中网页信息加入网页数据库将P(Di)中未被访问过的超链接加入优先级队列中终止条件:获取了“足够多”的网页认识爬虫Web爬虫的基本组成调度器:决定下一个需要下载的网页的URL下载器:根据调度器给出的URL,从Web上下载网页URL队列:排序待访问的URL和过滤已访问的URL网页数据库:存储和管理已下载的网页认识爬虫在Python2中,有urllib和urllib2两个库来实现请求的发送。而在Python3中已经不存在urllib2这个

库了,统一为urllib。urllib库,他是Python内置的HTTP请求库,也就是说不需要额外安装即可使用。它包含如下4个模块:request:它是最基本的HTTP请求模块,可以用来模拟发送请求。error:异常处理模块,如果出现请求错误,我们可以捕获这些异常并处理。parse:一个工具模块,提供许多URL的处理方法。robotparser:主要是用来识别网站的robots.txt文件,用来判断哪些网站是可以爬的。认识爬虫urllib类库在Python2中,有urllib和urllib2两个库来实现请求的发送。而在Python3中已经不存在urllib2这个库了,统一为urllib。urllib库,他是Python内置的HTTP请求库,也就是说不需要额外安装即可使用。它包含如下4个模块:request:它是最基本的HTTP请求模块,可以用来模拟发送请求。error:异常处理模块,如果出现请求错误,我们可以捕获这些异常并处理。parse:一个工具模块,提供许多URL的处理方法。robotparser:主要是用来识别网站的robots.txt文件,用来判断哪些网站是可以爬的。基础类库发送请求使用urllib.request模块,我们可以方便的实现请求的发送并得到响应。urllib.request模块提供了最基本的构造HTTP请求的方法,利用它可以摸拟浏览器的一个请求发起过程,同时它还带有处理授权验证(authenticaton)、重定向(redirection)、浏览器Cookies及其他内容。基础类库发送请求urlopen()举例下面我们来看一下它的强大之处,这里以百度首页为例,我们来把这个网页抓下来:这里我们只用了两行代码,便完成了百度首页的抓取,输出了网页的源代码。1 #导入模块2 importurllib.request3 #先服务器发出请求4 response=urllib.request.urlopen('')5 #获得浏览器响应的内容并设置编码6 print(response.read().decode('utf-8'))基础类库urlopen语法由上我们知道利用urlopen()方法可以实现最基本的请求发起,用于实现对目标url的访问。直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型。函数原型如下:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)url:需要打开的网址data:Post提交的数据timeout:设置网站的访问超时时间基础类库Request类库

我们知道利用urlopen()方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求。如果请求中需要加入Headers等信息,就可以利用更强大的Request类来构建。首先,我们用实例来感受一下Request的用法:1 importurllib.request#导入模块2 3 request=urllib.request.Request('')#构建一个Request类4 response=urllib.request.urlopen(request)#发送请求,参数不再是URL,而是一个Request类型的对象5 print(response.read().decode('utf-8'))#打印获得到的内容基础类库Request语法

一个Request类型的对象,可以由多个更加丰富和灵活地配置参数组成。下面我们看一下Request可以通过怎样的参数来构造,它的构造方法如下:urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)url:用于请求URL,这是必传参数,其他都是可选参数。data:如果要传,必须传bytes(字节流)类型的。如果它是字典,可以先用urllib.parse模块里的urlencode()编码。headers:是一个字典,它就是请求头,我们可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加。unverifiable:表示这个请求是否是无法验证的,默认是False。method:是一个字符串,用来指示请求使用的方法,比如GET、POST和PUT等。基础类库复杂HTML解析PART02面对页面解析难题时,很容易不假思索地直接写几行语句来提取信息。但是,像这样鲁莽放纵地使用技术,只会让程序变得难以调试或脆弱不堪,甚至二者兼备。在开始解析网页之前,让我们看一些可以避免解析复杂HTML页面的方式。假如你已经确定了目标内容,可能是一个名字、一组统计数据或者一段文字。你的目标内容可能隐藏在一个HTML“烂泥堆”的第20层标签里,带有许多没用的标签或HTML属性,假如你不经过考虑地直接写出下面这样一行代码来提取内容: bs.find_all(‘table’)[4].find_all(‘tr’)[2].find(‘td’).find_all(‘div’)[1].find(‘a’)虽然也可以达到目标,但是这样看起来并不是很好。除了代码欠缺美感之外,还有一个问题是,即便网络管理员对网站稍作修改,这行代码也会失效,甚至可能会毁掉整个网络爬虫。那么如果网站开发人员决定增加一张表格或者增加一列数据,你应该怎么做呢?如果网站开发人员在页面的顶部增加一个组件(一些div标签),你应该怎么做呢?以上的代码是不安全的,它依赖于网站的结构永远不变。HTML解析那你可以怎么做呢?寻找“打印此页”的连接,或者看看网站有没有HTML样式更友好的移动版(把自己的请求头设置成处于移动设备的状态,然后接收网站移动版)寻找隐藏在JavaScript文件里的信息。要是这一点,你可能需要查看网页加载的JavaScript文件。虽然网页标题经常会用到,但是这个信息也许可以从网页的URL连接里获取。如果你要找的信息只存在于一个网站上,别处没有,那你确实是运气不佳,如果不只限于这个网站,那么你可以找找其他数据源。有没有其他网站也显示了同样的数据?网站上显示的数据是不是从其他网站上抓取后攒出来的?尤其是在面对埋藏很深或格式不友好的数据时,千万不要不经思考就写代码,一定要三思而后行。如果你确定自己不能另辟蹊径,那么本章的内容就是为你准备的。接下来会介绍基于位置、上下文、属性和内容选择标签的标准方式和创新方式。HTML解析这一节将介绍通过属性查找标签的方法,标签组的使用,以及标签解析树的导航过程。基本上,你遇到的每个网站都有层叠样式表(cascadingstylesheet,CSS)。虽然你可能会认为,专门为了让浏览器和人类可以理解网站内容而设计一个展现样式的层,是一件愚蠢的事,但是CSS的发明确实是网络爬虫的福音。CSS可以让HTML元素呈现出差异化,使那些具有完全相同修饰的元素呈现出不同的样式。比如有些标签看起来是这样: <spanclass=“green”></span>而另一些标签看起来是这样: <spanclass=“red”></span>网络爬虫可以通过class属性的值,轻松地区分出两种不同的标签。例如,它们可以用BeautifulSoup抓取网页上所有红色的文字,而绿色的文字一个都不抓。因为CSS通过属性准确地呈现网站的样式,所以你大可放心,大多数现代网站上的class和id属性资源都非常的丰富。BeautifulSoup入场下面让我们创建一个网络爬虫来抓取/pages/waradpeace.html这个网页在这个页面里,小说人物的对话内容都是红色的,人物名称都是绿色的。你可以看到网页源代码里的span标签引用了对应的CSS属性,如下所示:<spanclass=“red”>Heavens!Whatavirulentattack!</span>replied<spanclass=“green”>theprince</span>,notintheleastdisconcertedbythisreception我们可以先抓取整个页面,然后创建一个BeautifulSoup对象:fromurllib2importurlopenfrombs4importBeautifulSouphtml=urlopen(‘/pages/page1.html’)bs=BeautifulSoup(html.read(),‘html.parser’)BeautifulSoup入场通过BeautifulSoup对象,我们可以使用find_all函数提取只包含在<spanclass=“green”></span>标签里的文字,这样就会得到一个人物名称的python列表(find_all是一个非常灵活的函数,后面会经常用到它): nameList=bs.find_all(‘span’,{‘class’:‘green’}) fornameinnameList: print(name.get_text())代码执行以后就会按照《战争与和平》中的人物出场顺序显示所有的人名。这是怎么实现的呢?之前我们调用bs.tagName只能获取页面中指定的第一个标签,现在,调用bs.find_all(tagName,tagAttributes)可以获取页面中所有指定的标签,不再只是第一个了。获取人名列表后,程序遍历列表中所有的名字,然后打印name.get_text(),就可以把标签中的内容分开显示了。BeautifulSoup入场BeautifulSoup的find()和find_all()可能是你最常用的两个函数。借助它们,可以通过标签的不同属性轻松过滤HTML页面,查找需要的标签组或单个标签。这两个函数非常相似,BeautifulSoup文档里两者的定义就是这样: find_all(tag,attributes,recursive,text,limit,keywords) find(tag,attributes,recursive,text,keywords)很可能你会发现,自己在95%的时间里都只需要使用前两个参数:tag和attributes。但是,我们还是应该仔细地看看所有的参数。标签参数tag,可以传递一个标签的名称或多个标签名称组成的Python列表做标签参数。例如,下面的代码将返回一个包含HTML文档中所有标题标签的列表: .find_all([‘h1’,‘h2’,‘h3’,‘h4’,‘h5’,‘h6’])属性参数attributes用一个Python字典封装一个标签的若干属性和对应的属性值。例如,下面的这个函数会返回HTML文档里红色与绿色的两种颜色的span标签: .find_all(‘span’,{‘class’:{‘green’,‘red’}})BeautifulSoup的find()和find_all()递归参数recursive是一个布尔变量。你想抓取HTML文档标签结构里多少层的信息?如果recursive设置为True,find_all就回根据你的要求去查找标签参数的所有子标签,以及子标签的子标签。如果recursive设置为False,find_all就只查找文档的一级标签。find_all默认是支持递归查找的(recursive默认值是True);一般情况下这个参数不需要设置,除非你真正了解自己需要哪些信息,而且抓取的速度非常重要,那时你可以设置递归参数。文本参数text有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。假如我们想查找前面网页中包含“theprince”内容的标签数量,可以把之前的find_all方法换成下面的代码: nameList=bs.find_all(text=‘theprince’) print(len(nameList))输出结果为“7”BeautifulSoup的find()和find_all()范围限制参数limit显然只用于find_all方法.find其实等价于limit等于1时defind_all。如果你想获取网页中的前X项结果,就可以设置它。但是要注意,设置这个参数之后,获得的前几项结果是按照网页上的顺序排序的,未必是能想要的那前几项。还有一个关键词参数keyword,可以让你选择那些具有指定属性的标签。例如: title=bs.find_all(id=‘title’,class_=‘text’)上述代码返回第一个在class_属性中包含单词text并且在id属性中包含title的标签。需要注意的是,通常情况下,页面中每个id的属性值只能被使用一次。因此在实际情况中,上面的代码可能并不实用,而以下代码可以达到同样的效果: title=bs.find(id=‘title’)讲到这里,可能会扪心自问:是不是已经知道如何用标签属性获取一组标签了?用字典把属性传到函数里就行了?回忆前面内容,通过标签参数tag把标签列表传到.find_all()里获取一组标签,其实就是一个“或”关系的过滤器(即选择所有带标签1、标签2或标签3……的标签)。如果标签列表很长,就需要花费很长时间才能写完。而关键词参数keyword可以让你增加一个“与”关系的过滤器来简化工作。BeautifulSoup的find()和find_all()BeautifulSoup对象:

前面代码中的bs标签Tag对象: BeautifulSoup对象通过find和find_all,或者直接调用子标签获取的一列对象或单个对象,就像: bs.div.h1但是这个库还有另外两种对象,虽然不常用,却应该了解一下。NavigableString对象:

用来表示标签里的文字,而不是标签本身(有些函数可以操作和生成NavigableString对象,而不是标签对象)Comment对象:

用来查找HTML文档的注释标签,<!--像这样-->。这四个对象是用BeautifulSoup库时会遇到的所有对象。BeautifulSoup对象正则表达式语法PART03字符串中提供的find、rfind等方法可以实现字符串的精确匹配,即在一个字符串中查找另一个字符串出现的位置。而通过正则表达式可以定义一些匹配规则,只要满足匹配规则即认为匹配成功,从而实现模糊匹配。正则表达式中既可以包含普通字符,也可以包含由特殊字符指定的匹配模式。在实际应用正则表达式进行匹配时,正则表达式中的普通字符需要做精确匹配,而特殊字符指定的匹配模式则对应了用于模糊匹配的规则。基础语法占位符描述.(点)匹配换行外的任一字符。例如,对于正则表达式“ab.c”,其与“abdc”和“ab1c”匹配,但与“acdb”、“abc”和“ab12c”不匹配。^(插入符)匹配字符串开头的若干字符。例如,对于正则表达式“^py”,其与“python”匹配,但与“puppy”不匹配。$匹配字符串末尾的若干字符。例如,对于正则表达式“py$”,其与“puppy”匹配,但与“python”不匹配。[]字符集合,对应位置可以是该集合中的任一字符。既可以依次指定每一个字符,如[0123456789];也可以通过短横线“-”指定一个范围,如[0-9]。在字符序列前加^表示取反,如[^0-9]表示匹配不在0至9之间的字符*匹配前一个模式0次或多次。例如,对于正则表达式“a[0-9]*c”,其与“ac”、“a0c”和“a01c”匹配,但与“abc”不匹配+匹配前一个模式1次或多次。例如,对于正则表达式“a[0-9]+c”,其与“a0c”和“a01c”匹配,但与“ac”和“abc”不匹配?匹配前一个模式0次或1次。例如,对于正则表达式“a[0-9]?c”,其与“ac”和“a0c”匹配,但与“a01c”和“abc”不匹配正则表达式中的部分匹配模式基础语法占位符描述{m}匹配前一个模式m次。例如,对于正则表达式“a[0-9]{1}c”,其与“a0c”匹配,但与“ac”、“a01c”和“abc”不匹配{m,n}匹配前一个模式m至n次;省略n则匹配前一个模式m次至无限次。例如,对于正则表达式“a[0-9]{1,2}c”,其与“a0c”和“a01c”匹配,但与“ac”和“abc”不匹配|“A|B”表示匹配A或B中的任一模式即可。例如,对于正则表达式“a[b|d]c”,其与“abc”和“adc”匹配,但与“ac”、“aac”和“abbc”不匹配。(…)用()括起来的内容表示一个分组。在匹配完成后,可以获取每个分组在字符串中匹配到的内容。例如,对于正则表达式“(.*?)abc”,其与“123abc456abc”匹配结果为“123”和“456”;而对于正则表达式“(.*)abc”,其与“123abc456abc”匹配结果为“123abc456”。“*?”与“*”的区别在于:“*?”每次匹配尽可能少的字符;而“*”每次会匹配尽可能多的字符\转义符,使后面一个字符改变原来的含义。例如,在正则表达式中要精确匹配字符$,则需要写成“\$”;要精确匹配字符^,则需要写成“\^”正则表达式中的部分匹配模式_续基础语法特殊序列描述\numbernumber表示一个数字,\number用于引用同一编号的分组中的模式(分组编号从1开始)。例如,对于正则表达式“([0-9])abc\1”,其中的“\1”就表示引用第1个分组中的模式“[0-9]”,即等价于“([0-9])abc[0-9]”,匹配以一个数字开头、一个数字结尾、中间是abc的字符串\A匹配字符串开头的若干字符,同^\b单词边界符,即\b两边的字符应该一个是非单词字符、另一个是单词字符,或者一个是单词字符、另一个是空字符(即字符串的开头或末尾)。例如,对于正则表达式“\bfoo\b”,其与“foo”、“foo.”、“(foo)”和“barfoobaz”匹配,但与“foobar”、“foo3”和“foo_bar”不匹配\B非单词边界符,与\b功能相反\d匹配任一数字字符,等价于[0-9]\D与\d作用相反,匹配任一非数字字符,等价于[^0-9]\s匹配任一空白字符\S与\s作用相反,匹配任一非空白字符\w匹配包含数字和下划线在内的任一可能出现在单词中的字符\W与\w作用相反,即匹配\w不匹配的那些特殊字符\Z匹配字符串末尾的若干字符,同表6-2中的$正则表达式中的特殊序列基础语法Re模块的使用PART04使用Python提供的re模块,可以实现基于正则表达式的模糊匹配。re模块中提供了多个函数,下面分别介绍。使用re模块中的函数前,要先通过“importre”导入re模块。re模块Re模块的使用【任务描述】了解Re模块的功能与常用操作了解爬虫【关键步骤】了解Re模块的功能与常用操作了解爬虫示例01pile(pattern,flags=0)compile函数用于将一个字符串形式的正则表达式编译成一个正则表达式对象,供match、search以及其他一些函数使用。compile函数的语法格式为:其中,pattern是一个字符串形式的正则表达式;flags指定了匹配选项,可以使用按位或(|)运算符将多个选项连接起来;flags的默认值为0,表示没有任何匹配选项。Re模块的使用示例01compile中flags参数对应的匹配选项匹配选项描述re.A或re.ASCII使\w、\W、\b、\B、\d、\D、\s、\S仅作ASCII码的匹配,而不是Unicode码的匹配re.DEBUG显示被编译正则表达式的调试信息re.I或re.IGNORECASE匹配时不区分大小写re.L或re.LOCATE使\w、\W、\b、\B和不区分大小写的匹配取决于当前的语言环境(不建议使用)re.M或re.MULTILINE使^能够匹配每行的开头若干个字符,$能够匹配每行的结尾若干个字符re.S或re.DOTALL使.(点)能够匹配任一字符(包括换行符)re.X或re.VERBOSE忽略正则表达式中的空格和#后面的注释Re模块的使用示例01re.match(pattern,string,flags=0)re模块中的match函数用于对字符串开头的若干字符进行正则表达式的匹配。re.match函数的语法格式为:其中,pattern是要匹配的正则表达式;string要作正则表达式匹配的字符串;flags参数的含义与compile函数中的flags参数相同。如果匹配成功,则返回一个Match对象;如果匹配失败,则返回None。Re模块的使用示例011 importre2 result1=re.match(r'python','Python是一门流行的编程语言',re.I)3 result2=re.match(r'python','我喜欢学习Python',re.I)4 result3=re.match(r'python','''我喜欢学习Python5 Python是一门流行的编程语言''',re.I|re.M)6 print('result1:',result1)7 print('result2:',result2)8 print('result3:',result3)re.match函数使用示例result1:<re.Matchobject;span=(0,6),match='Python'>result2:Noneresult3:None程序执行完毕后,将在屏幕上输出如下结果:Re模块的使用示例01Pattern.match(string[,pos[,endpos]])除直接调用re模块中的match函数外,也可以使用compile函数生成的正则表达式对象中的match方法实现同样功能其中,Pattern是compile函数返回的正则表达式对象;string是要作正则表达式匹配的字符串;可选参数pos指定了从string的哪个位置开始进行匹配,默认为0;可选参数endpos指定了string的结束位置match函数将对string中pos至endpos-1范围的子串进行正则表达式匹配。Re模块的使用示例011 importre2 pattern=pile(r'python',re.I)#生成正则表达式对象3 result1=pattern.match('Python是一门流行的编程语言')4 result2=pattern.match('我喜欢学习Python!',5)5 print('result1:',result1)6 print('result2:',result2)Pattern.match方法使用示例result1:<re.Matchobject;span=(0,6),match='Python'>result2:<re.Matchobject;span=(5,11),match='Python'>程序执行完毕后,将在屏幕上输出如下结果:Re模块的使用示例01re.search(pattern,string,flags=0)re模块中的search函数对整个字符串进行扫描并返回第一个匹配的结果。re.search函数的语法格式为:re.search函数各参数的含义与re.match函数完全相同。如果匹配成功,则返回一个Match对象;否则,返回None。Re模块的使用示例011 importre2 result1=re.search(r'python','Python是一门流行的编程语言',re.I)3 result2=re.search(r'python','我喜欢学习Python!',re.I)4 result3=re.search(r'python','我喜欢学习Python,Python简单易用!',re.I)5 result4=re.search(r'Java','我喜欢学习Python!',re.I)6 print('result1:',result1)7 print('result2:',result2)8 print('result3:',result3)9 print('result4:',result4)re.search函数使用示例result1:<re.Matchobject;span=(0,6),match='Python'>result2:<re.Matchobject;span=(5,11),match='Python'>result3:<re.Matchobject;span=(5,11),match='Python'>result4:None程序执行完毕后,将在屏幕上输出如下结果:Re模块的使用示例01Pattern.search(string[,pos[,endpos]])也可使用compile函数返回的正则表达式对象中的search方法实现re.search函数同样功能各参数含义与Pattern.match方法完全相同。Re模块的使用示例011 importre2 result1=re.search(r'python','我喜欢学习Python!',re.I)3 ifresult1:#判断是否匹配成功4 print('result1:',result1)#匹配成功则输出返回的Match对象5 result2=re.match(r'python','我喜欢学习Python!',re.I)6 ifresult2:#判断是否匹配成功7 print('result2:',result2)#匹配成功则输出返回的Match对象Match对象操作示例1result1:<re.Matchobject;span=(5,11),match='Python'>程序执行完毕后,将在屏幕上输出如下结果:Re模块的使用示例01Match对象方法描述group([group1,…])根据传入的组号返回对应分组的匹配结果。如果传入一个组号,则返回一个字符串形式的匹配结果;如果传入多个组号,则返回一个由多个匹配结果字符串组成的元组。如果传入0,则返回的是与正则表达式匹配的整个字符串groups()返回一个由所有分组的匹配结果字符串组成的元组start(group=0)返回指定分组的匹配结果字符串在原字符串中的起始位置;如果group值为0(默认值),则返回与正则表达式匹配的整个字符串在原字符串中的起始位置end(group=0)返回指定分组的匹配结果字符串在原字符串中的结束位置;如果group值为0(默认值),则返回与正则表达式匹配的整个字符串在原字符串中的结束位置Match对象的部分方法Re模块的使用示例011 importre2 str='''sno:#1810101#,name:#李晓明#,age:#19#,major:#计算机#3 sno:#1810102#,name:#马红#,age:#20#,major:#数学#'''4 rlt=re.search(r'name:#([\s\S]*?)#[\s\S]*?major:#([\s\S]*?)#',str,re.I)5 ifrlt:#判断是否有匹配结果6 print('匹配到的整个字符串:',rlt.group())7 print('name:%s,startpos:%d,endpos:%d'%(rlt.group(1),rlt.start(1),rlt.end(1)))8 print('major:%s,startpos:%d,endpos:%d'%(rlt.group(2),rlt.start(2),rlt.end(2)))9 print('所有分组匹配结果:',rlt.groups())10 else:11 print('未找到匹配信息')Match对象操作示例2匹配到的整个字符串:name:#李晓明#,age:#19#,major:#计算机#name:李晓明,startpos:20,endpos:23major:计算机,startpos:41,endpos:44所有分组匹配结果:('李晓明','计算机')程序执行完毕后,将在屏幕上输出如下结果:Re模块的使用示例01re.findall(pattern,string,flags=0)re模块中的findall函数用于在字符串中找到所有与正则表达式匹配的子串。re.findall函数的语法格式为:各参数含义与re.match和re.search函数完全相同。如果匹配成功,则将匹配的子串以列表的形式返回;如果匹配失败,则返回空列表。Re模块的使用示例011 importre2 str='''sno:#1810101#,name:#李晓明#,age:#19#,major:#计算机#3 sno:#1810102#,name:#马红#,age:#20#,major:#数学#'''4 rlt=re.findall(r'name:#([\s\S]*?)#[\s\S]*?major:#([\s\S]*?)#',str,re.I)5 print(rlt)示例[('李晓明','计算机'),('马红','数学')]程序执行完毕后,将在屏幕上输出如下结果:Re模块的使用示例01re.finditer(pattern,string,flags=0)与re.findall函数功能唯一区别在于re.findall函数返回列表形式的结果,而re.finditer返回迭代器形式的结果。各参数含义与re.findall函数完全相同。Re模块的使用示例011 importre2 str='''sno:#1810101#,name:#李晓明#,age:#19#,major:#计算机#3 sno:#1810102#,name:#马红#,age:#20#,major:#数学#'''4 rlt1=re.finditer(r'name:#([\s\S]*?)#[\s\S]*?major:#([\s\S]*?)#',str,re.I)5 rlt2=re.finditer(r'department:#([\s\S]*?)#',str,re.I)6 print('rlt1:')7 forrinrlt1:8 print(r)9 print('rlt2:')10 forrinrlt2:11 print(r)示例rl

温馨提示

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

评论

0/150

提交评论