第3章-正则表达式与文件操作课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第3章-正则表达式与文件操作课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则 表达式 文件 操作 课件
- 资源描述:
-
1、Python Crawler Development Python Crawler Development 极客学院极客学院 JJ互联网互联网+职业技能系列职业技能系列PythonPython爬虫开发爬虫开发 从入门从入门到实战(微课版)到实战(微课版)人民邮电出版社人民邮电出版社谢乾坤谢乾坤著著第第3 3章章 正则表达式正则表达式与文件操作与文件操作 在爬虫的开发中,需要把有用的信息从一大段文本中提取出在爬虫的开发中,需要把有用的信息从一大段文本中提取出来。正则表达式是提取信息的方法之一。来。正则表达式是提取信息的方法之一。正则表达式虽然不是最简单的也不是最高效的数据提取方法,正则表达式虽然
2、不是最简单的也不是最高效的数据提取方法,但它是最直接的。而且在某些情况下,只有使用正则表达式才能但它是最直接的。而且在某些情况下,只有使用正则表达式才能达到目的。学好正则表达式,是开发爬虫的第一步。达到目的。学好正则表达式,是开发爬虫的第一步。通过通过这一章的学习,你将会掌握如下知识。这一章的学习,你将会掌握如下知识。(1)正则表达式的基本符号。)正则表达式的基本符号。(2)如何在)如何在Python中使用正则表达式。中使用正则表达式。(3)正则表达式的提取技巧。)正则表达式的提取技巧。(4)Python读写文本文件和读写文本文件和CSV文件。文件。3.1 3.1 正则表达式正则表达式 正则表
3、达式正则表达式(RegularExpression)是一段字符串,它可以表示)是一段字符串,它可以表示一段有规律的信息。一段有规律的信息。Python自带一个正则表达式模块,通过这个模自带一个正则表达式模块,通过这个模块可以查找、提取、替换一段有规律的信息。块可以查找、提取、替换一段有规律的信息。在在程序开发中,要让计算机程序从一大段文本中找到需要的内程序开发中,要让计算机程序从一大段文本中找到需要的内容,就可以使用正则表达式来实现。容,就可以使用正则表达式来实现。使用使用正则表达式有如下步骤。正则表达式有如下步骤。(1)寻找规律。)寻找规律。(2)使用正则符号表示规律。)使用正则符号表示规律
4、。(3)提取信息。)提取信息。1点号点号“.”一一个点号可以代替除了换行符以外的任何一个字符,包括个点号可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符但不限于英文字母、数字、汉字、英文标点符号和中文标点符号号。2星号星号“*”一一个星号可以表示它前面的一个子表达式(普通字符、另个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)一个或几个正则表达式符号)0次到无限次。次到无限次。3.1.1 3.1.1 正则表达式的基本符号正则表达式的基本符号 3问号问号“?”问号问号表示它前面的子表达式表示它前面的子表达式0次或者次或者1
5、次。注意,这里的问号次。注意,这里的问号是英文问号。是英文问号。4反斜杠反斜杠“”反反斜杠在正则表达式里面不能单独使用,甚至在整个斜杠在正则表达式里面不能单独使用,甚至在整个Python里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊符号变成普通符号,把普通符号变成特殊符号。符号变成普通符号,把普通符号变成特殊符号。反反斜杠不仅可以把特殊符号变成普通符号,还可以把普通斜杠不仅可以把特殊符号变成普通符号,还可以把普通符号变成特殊符号符号变成特殊符号。例如例如“n”只是一个普通的字母,但是只是一个普通的字母,但是“n”代表换行符代表换
6、行符。在在Python开发中,经常遇到的转义字符,如表开发中,经常遇到的转义字符,如表3-1所示。所示。转义字符转义字符意义意义n换行符换行符t制表符制表符普通的反斜杠普通的反斜杠单引号单引号双引号双引号d数字数字表表3-1 常见的转义字符常见的转义字符 5数字数字“d”正则表达式正则表达式里面使用里面使用“d”来表示一位数字。为什么要用字来表示一位数字。为什么要用字母母d呢?因为呢?因为d是英文是英文“digital(数字)(数字)”的首字母。的首字母。再次再次强调一下,强调一下,“d”虽然是由反斜杠和字母虽然是由反斜杠和字母d构成的,但构成的,但是要把是要把“d”看成一个正则表达式符号整体
7、。看成一个正则表达式符号整体。6小括号小括号“()”小括号小括号可以把括号里面的内容提取出来。可以把括号里面的内容提取出来。3.1.2 3.1.2 在在PythonPython中使用正则表达式中使用正则表达式 Python 已经自带了一个功能非常强大的正则表达式模块。已经自带了一个功能非常强大的正则表达式模块。使用这个模块可以非常方便地通过正则表达式来从一大段文字使用这个模块可以非常方便地通过正则表达式来从一大段文字中提取有中提取有规律的信息。规律的信息。Python的正则表达式模块名字为的正则表达式模块名字为“re”,也就是,也就是“regular expression”的首字母缩写。在的首
8、字母缩写。在Python中需要首先导入这个模块中需要首先导入这个模块再进行使用。导入的语句为:再进行使用。导入的语句为:import re 1findall Python的正则表达式模块包含一个的正则表达式模块包含一个findall方法,它能够以列方法,它能够以列表的形式返回所有满足要求的字符串。表的形式返回所有满足要求的字符串。findall的函数原型为:的函数原型为:re.findall(pattern,string,flags=0)pattern表示正则表达式,表示正则表达式,string表示原来的字符串,表示原来的字符串,flags表表示一些特殊功能的标志。示一些特殊功能的标志。fin
9、dall的结果是一个列表,包含了所有的匹配到的结果。如的结果是一个列表,包含了所有的匹配到的结果。如果没有匹配到结果,就会返回空列表,如图果没有匹配到结果,就会返回空列表,如图3-1所示。所示。图图3-1 findall返回的内容返回的内容 当当需要提取某些内容的时候,使用小括号将这些内容括起需要提取某些内容的时候,使用小括号将这些内容括起来,这样才不会得到不相干的信息。如果包含多个来,这样才不会得到不相干的信息。如果包含多个“(.*?)”怎么怎么返回呢?如图返回呢?如图3-2所示,返回的仍然是一个列表,但是列表里面所示,返回的仍然是一个列表,但是列表里面的元素变为了元组,元组里面的第的元素变
10、为了元组,元组里面的第1个元素是账号,第个元素是账号,第2个元素个元素为密码。为密码。图图3-2 多个括号内的内容会以元组形式返回多个括号内的内容会以元组形式返回 请请注意代码中的冒号和逗号,图注意代码中的冒号和逗号,图3-1代码中为中文冒号和中代码中为中文冒号和中文逗号;图文逗号;图3-2代码中为英文冒号和英文逗号。在实际使用正则代码中为英文冒号和英文逗号。在实际使用正则表达式的过程中,中英文标点符号混淆常常会导致各种问题。表达式的过程中,中英文标点符号混淆常常会导致各种问题。特别是冒号、逗号和引号,虽然中英文看起来非常相似,但实特别是冒号、逗号和引号,虽然中英文看起来非常相似,但实际上中文
11、冒号和英文冒号是不一样的,中文逗号和英文逗号也际上中文冒号和英文冒号是不一样的,中文逗号和英文逗号也是不一样的是不一样的。在在某些字体里面,这种差异甚至无法察觉,因此在涉及正某些字体里面,这种差异甚至无法察觉,因此在涉及正则表达式中的标点符号时,最好直接复制粘贴,而不要手动输则表达式中的标点符号时,最好直接复制粘贴,而不要手动输入。入。函数函数原型中有一个原型中有一个flags参数。这个参数是可以省略的。当参数。这个参数是可以省略的。当不省略的时候,具有一些辅助功能,例如忽略大小写、忽略换不省略的时候,具有一些辅助功能,例如忽略大小写、忽略换行符等。这里以忽略换行符为例来进行说明,如图行符等。
12、这里以忽略换行符为例来进行说明,如图3-3所示。所示。图图3-3 3-3 使用使用re.Sre.S作为作为flagflag来忽略换行符来忽略换行符 在在爬虫的开发过程中非常容易出现这样的情况,要匹配的爬虫的开发过程中非常容易出现这样的情况,要匹配的内容存在换行符内容存在换行符“n”。要忽略换行符,就需要使用到。要忽略换行符,就需要使用到“re.S”这个这个flag。虽然说匹配到的结果中出现了。虽然说匹配到的结果中出现了“n”这个符号,不过这个符号,不过总比什么都得不到强。内容里面的换行符在后期清洗数据的时总比什么都得不到强。内容里面的换行符在后期清洗数据的时候把它替换掉即可。候把它替换掉即可。
13、2search search()的用法和的用法和findall()的用法一样,但是的用法一样,但是search()只会返回只会返回第第1个满足要求的字符串。一旦找到符合要求的内容,它就会停个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。对于从超级大的文本里面只找第止查找。对于从超级大的文本里面只找第1个数据特别有用,可个数据特别有用,可以大大提高程序的运行效率。以大大提高程序的运行效率。search()的函数原型为:的函数原型为:re.search(pattern,string,flags=0)对于对于结果,如果匹配成功,则是一个正则表达式的对象;结果,如果匹配成功,则是一个正则表
14、达式的对象;如果没有匹配到任何数据,就是如果没有匹配到任何数据,就是None。如果如果需要得到匹配到的结果,则需要通过需要得到匹配到的结果,则需要通过.group()这个方法这个方法来获取里面的值,如图来获取里面的值,如图3-4所示。所示。图图3-4 使用使用.group()来获取来获取search()方法找到的结果方法找到的结果 只有只有在在.group()里面的参数为里面的参数为1的时候,才会把正则表达式里的时候,才会把正则表达式里面的括号中的结果打印出来。面的括号中的结果打印出来。.group()的参数最大不能超过正则表达式里面括号的个数。的参数最大不能超过正则表达式里面括号的个数。参数
15、为参数为1表示读取第表示读取第1个括号中的内容,参数为个括号中的内容,参数为2表示读取第表示读取第2个个括号中的内容,以此类推,如图括号中的内容,以此类推,如图3-5所示。所示。图图3-5 .group()的参数意义的参数意义 3“.*”和和“.*?”的区别的区别 在在爬虫开发中,爬虫开发中,.*?这这3个符号大多数情况下一起使用。个符号大多数情况下一起使用。点点号表示任意非换行符的字符,星号表示匹配它前面的字符号表示任意非换行符的字符,星号表示匹配它前面的字符0次或者任意多次。所以次或者任意多次。所以“.*”表示匹配一串任意长度的字符串任意表示匹配一串任意长度的字符串任意次。这个时候必须在次
16、。这个时候必须在“.*”的前后加其他的符号来限定范围,否则的前后加其他的符号来限定范围,否则得到的结果就是原来的整个字符串。得到的结果就是原来的整个字符串。如果如果在在“.*”的后面加一个问号,变成的后面加一个问号,变成“.*?”,那么可以得,那么可以得到什么样的结果呢?问号表示匹配它前面的符号到什么样的结果呢?问号表示匹配它前面的符号0次或者次或者1次。于次。于是是.*?的意思就是匹配一个能满足要求的最短字符串。的意思就是匹配一个能满足要求的最短字符串。这样这样说起来还是非常抽象,下面通过一个实际的例子来进行说起来还是非常抽象,下面通过一个实际的例子来进行说明。请看下面这一段话:说明。请看下
17、面这一段话:我的微博密码是:我的微博密码是:1234567,QQ密码是:密码是:33445566,银行卡密银行卡密码是:码是:888888,Github密码是:密码是:999abc999,帮我记住它们,帮我记住它们 这这段话有一个显著的规律,即密码是:段话有一个显著的规律,即密码是:xxxxxx,”,也就是,也就是在在“密码是密码是”这这3个汉字的后面跟一个中文的冒号,冒号后面是个汉字的后面跟一个中文的冒号,冒号后面是密码,密码后面是中文的逗号。密码,密码后面是中文的逗号。如果如果想把这想把这4个密码提取出来,可以构造以下两个正则表达个密码提取出来,可以构造以下两个正则表达式:式:密码是:密码
18、是:(.*),密码是:密码是:(.*?),配合配合Python的的findall方法,得到结果如图方法,得到结果如图3-6图所示。图所示。图图3-6 使用使用“.*”和和“.*?”返回的结果返回的结果 使用使用“(.*)”得到的是只有一个元素的列表,里面是一个很得到的是只有一个元素的列表,里面是一个很长的字符串。长的字符串。使用使用第第2个正则表达式个正则表达式“(.*?)”,得到的结果是包含,得到的结果是包含4个元素个元素的列表,每个元素直接对应原来文本中的每个密码。的列表,每个元素直接对应原来文本中的每个密码。一句话一句话总结如下。总结如下。“.*”:贪婪模式,获取最长的满足条件的字符串。
19、:贪婪模式,获取最长的满足条件的字符串。“.*?”:非贪婪模式,获取最短的能满足条件的字符串。:非贪婪模式,获取最短的能满足条件的字符串。3.1.3 3.1.3 正则表达式提取技巧正则表达式提取技巧1不需要不需要compile 网上很多人的文章中,正则表达式使用网上很多人的文章中,正则表达式使用pile()这个方法,这个方法,导致代码变成下面这样:导致代码变成下面这样:import re example_text=我是我是kingname,我的微博账号是我的微博账号是:kingname,密密码是码是:12345678,QQ账号是账号是:99999,密码是密码是:890abcd,银行卡账号是银行
20、卡账号是:000001,密码是密码是:654321,Github账号是账号是:,密码是密码是:7777love8888,请记住他们。请记住他们。new_pattern=pile(账号是账号是:(.*?),密码是密码是:(.*?),re.S)user_pass=re.findall(new_pattern,example_text)print(user_pass)这种这种写法虽然结果正确,但纯粹是画蛇添足,是对写法虽然结果正确,但纯粹是画蛇添足,是对Python的的正则表达式模块没有理解透彻的体现,是从其他正则表达式模块没有理解透彻的体现,是从其他啰啰嗦的编程语言嗦的编程语言中带来的坏习惯。如果
21、阅读中带来的坏习惯。如果阅读Python的正则表达式模块的源代码,的正则表达式模块的源代码,就可以看出就可以看出pile()是完全没有必要的。是完全没有必要的。对比对比pile()和和re.findall()在源代码中的写法,如图在源代码中的写法,如图3-7所所示的两个方框。示的两个方框。图图3-7 Python正则表达式模块中的正则表达式模块中的re.findall()和和pile()使用使用pile()的时候,程序内部调用的是的时候,程序内部调用的是_compile()方法;方法;当使用当使用re.finall()的时候,在模块内部自动先调用了的时候,在模块内部自动先调用了_compile
22、()方方法,再调用法,再调用findall()方法。方法。re.findall()自带自带pile()的功能,所的功能,所以没有必要使用以没有必要使用pile()。Python3中正则表达式模块的源代码的入口文件为中正则表达式模块的源代码的入口文件为re.py。这。这个文件里面的注释就是学习个文件里面的注释就是学习Python正则表达式模块非常好的文档,正则表达式模块非常好的文档,它包含了正则表达式各种符号的简单说明和这个模块内部各个方它包含了正则表达式各种符号的简单说明和这个模块内部各个方法的使用,如图法的使用,如图3-8所示。所示。图图3-8 Python re.py文件自带的文档文件自带
23、的文档 2先抓大再抓小先抓大再抓小 一些一些无效内容和有效内容可能具有相同的规则。这种情况无效内容和有效内容可能具有相同的规则。这种情况下很容易把有效内容和无效内容混在一起,如下面这段文字:下很容易把有效内容和无效内容混在一起,如下面这段文字:有效有效用户用户:姓名姓名:张三张三 姓名姓名:李四李四 姓名姓名:王王五五 无效用户无效用户:姓名姓名:不知名的小虾米不知名的小虾米 姓名姓名:隐身的张大侠隐身的张大侠 有效有效用户和无效用户的名字前面都以用户和无效用户的名字前面都以“姓名姓名:”开头,如果开头,如果使用使用“姓名姓名:(.*?)n”来进行匹配,就会把有效信息和无效信息来进行匹配,就会
24、把有效信息和无效信息混在一起,难以区分,如图混在一起,难以区分,如图3-9所示。所示。图图3-9 使用使用“姓名姓名:(.*?)n”导致有效内容导致有效内容和和无效内容混在无效内容混在一起一起 要要解决这个问题,就需要使用解决这个问题,就需要使用先抓大再抓小的技巧。先把有效用先抓大再抓小的技巧。先把有效用户这个整体匹配出来,再从有效用户这个整体匹配出来,再从有效用户里面匹配出人名,代码和运行效户里面匹配出人名,代码和运行效果如图果如图3-10所示。先抓大再抓小的所示。先抓大再抓小的思想会贯穿整个爬虫开发过程,一思想会贯穿整个爬虫开发过程,一定要重点掌握。定要重点掌握。图图3-10 代码和运行效
展开阅读全文