欢迎大家关注公众号【哈希大数据】

【小白学爬虫连载(1)】-爬虫框架简介

【小白学爬虫连载(2)】--Requests库介绍

【小白学爬虫连载(3)】--正则表达式详细介绍

【小白学爬虫连载(4)】-如何使用chrome分析目标网站

【小白学爬虫连载(5)】--Beautiful Soup库详解

【小白学爬虫连载(6)】--Selenium库详解

【小白学爬虫连载(7)】--scrapy框架的安装

【小白学爬虫连载(8)】--scrapy框架入门教程

【小白学爬虫连载(9)】--scrapy构架设计分析

【小白学爬虫连载(10)】--如何用Python实现模拟登陆网站

【小白学爬虫连载(11)】--获取免费高匿代理IP

【小白学爬虫连载(11)】--pyquery库详解

【小白学爬虫连载(13)】--Scrapy如何突破反爬虫

小白学爬虫系列(2) 中介绍了如何用Requests获取网页内容,可是HTML文档中的内容比较繁杂,如何提取出我们需要的信息呢?本篇文章为大家介绍一个用于文本信息提取的强有力的工具——正则表达式
一、什么是正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某种条件的子串等。——菜鸟教程
正则表达式在文本处理中十分常用,可以用于查找、替换、匹配一组字符串。接下来介绍几个正则表达式经典的实例:

正则表达式

由实例可以看出正则表达式的语由字符和操作符构成,正则表达式的常用操作符如下表所示:

操作符

二、Re库正则表达式表示介绍
正则表达式不是Python独有的,Python中re标准库,提供正则表达式的各种处理,接下来我们初步认识一下这个库。
首先re库可采用string和raw string(原生字符串)两种类型表示正则表达式,建议大家使用原生字符串。什么是原生字符串呢?在一般字符串'abc\tdef'前面加一个r,便成为了原生字符串。它的作用是使转义符\不起作用,字符串原样输出。比如:

s1 = r'abc\tdef'
print(s)
abc def
print(s1)
abc\tdef

原生字符串s1并没有把\t识别为制表符。同时大家要特别注意的是由于正则表达式使用反斜杠来转义特殊字符,而python自身处理字符串时,反斜杠也是用于转义字符,这样就产生了一个双重转换的问题。这个地方稍微有些复杂,不想深究可跳过下面不同字体的部分,大家只需注意当正则表达式包含转义符时使用原生字符串表示正则表达式就好。
接下来以匹配字符串s = 'abc-123'为例讲解。

s = 'abc\-123'
s1 = re.match('abc\\\\-123', s)
print("s1匹配结果:{}".format(s1.group()))
s1匹配结果:abc\-123
s2 = re.match(r'abc\\-123', s)
print("s2匹配结果:{}".format(s2.group()))
s2匹配结果:abc\-123

很明显我们需要注意两个地方,我们用'abc\\-123'和r'abc\-123'都能完成的对字符串s的匹配,字符串'abc\\-123'匹配过程中如下:首先因为它不是原始字符串,字符串转义函数会对其转义得到正则表达式'abc\-123',然后正则表达式'abc\-123'又会被正则表达式转义函数转义为字符串'abc-123',完成了对字符串s的匹配。原生字符串r'abc\-123'匹配过程如下,由于是原生字符串所以不会被转义,直接打到正则表达式'abc\-123',然后正则表达式'abc\-123'又会被正则表达式转义函数转义为字符串'abc-123'。所以两种情况都可以匹配成功。这里面提到字符串转义和正则表达式转义它们两个是有不同的,因为正则表达式的特殊字符和字符串特殊字符存在不同之处,如 * 在正则表达式中代表匹配前面的子表达式0次或多次,而在在字符串中不是特殊字符。你可以尝试理解下面这种情况,看看自己是否真正理解了上述过程:

s = '*abc123'
s1 = re.match('\*abc123', s)
print("s1匹配结果:{}".format(s1.group()))
s1匹配结果:*abc123
s2 = re.match('\\*abc123', s)
print("s2匹配结果:{}".format(s2.group()))
s2匹配结果:*abc123

三、Re库主要函数介绍

函数

re.match(pattern, string, flags=0)样例:

print(re.match('www', 'www.mingmenyun.com').group()) # 在起始位置匹配
print(re.match('com', 'www.mingmenyun.com')) # 不在起始位置匹配

运行结果为:
www
None
re.search(pattern, string, flags=0)样例:

print(re.search('www', 'www.mingmenyun.com').group()) # 在起始位置匹配
print(re.search('com', 'www.mingmenyun.com').group()) # 不在起始位置匹配
print(re.search('我爱你', 'Python我爱你,爬虫我爱你').group()) # 不在起始位置匹配

运行结果:
www
com
我爱你
re.findall(pattern, string, flags=0)样例:

print(re.findall('我爱你', 'Python我爱你,爬虫我爱你'))

运行结果:
['我爱你', '我爱你']
re.sub(pattern, repl, string, count=0)
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
样例:

print(re.sub(r'\d', '', "大河12向东流34,天上332的星星1参23北5斗"))

运行结果:
大河向东流,天上的星星参北斗
re.compile(pattern, flags=0)样例:

regex = re.compile('我爱你')
print(regex.findall('Python我爱你,爬虫我爱你'))

运行结果:
['我爱你', '我爱你']
re.match与re.search的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.search与re.findall的区别:
re.search只返回找到的第一个匹配,而re.findall返回所有匹配的的结果。
三、匹配目标获取与匹配模式
获取匹配目标:
样例:

s = 'Hello my QQ is 1428941524,welcome to contect me!'
result = re.match('^Hello.*\s(\d+),.*me!$', s)
print(result.group(1))
print(result.span())

运行结果:
1428941524
(0, 48)
如样例所示用()将想提取的信息括起来,group(1)代表第一个小括号内的内容,group(2)代表第二个...,这样便能提取出我们想要的信息啦。
匹配模式:
样例:

s = '''Hello
my QQ is 1428941524,welcome to contect me!'''
result = re.match('^Hello.*\s(\d+),.*me!$', s, re.S)
print(result.group(1))
print(result.span())

运行结果:
1428941524
(0, 48)
该样例与获取目标样例的不同之处在于,字符串s变为了多和字符串,中间出现了换行,match函数中多了re.S。此时不加它的话程序出错。re.S就是定义匹配模式的,类似的匹配模式如下表所示:

4.png

四、贪婪匹配与非贪婪匹配
贪婪匹配:
样例:

s = '''Hello
my QQ is 1428941524,welcome to contect me!'''
result = re.match('^Hello.*(\d+).*me!$', s, re.S)
print(result.group(1))

运行结果:
4
结果只匹配到了4,142894152都被.匹配到了,.会尽可能多的匹配字符这就是贪婪匹配,由于后面有\d所以至少要匹配到一个数字,这是咱们不愿意看到的,有什么解决办法吗?当然有下面介绍非贪婪匹配。
非贪婪匹配:
样例:

s = '''Hello
my QQ is 1428941524,welcome to contect me!'''
result = re.match('^Hello.*?(\d+).*me!$', s, re.S)
print(result.group(1))

运行结果:
1428941524
非贪婪模式与贪婪模式的不同之处就在于在.*后加了一个?,非贪婪模式又称为最小匹配模式,就是说它会匹配到尽可能少的字符。
小结
本篇文章主要介绍了以下几点内容:

  • 什么是正则表达式,正则表达式的常用操作符

  • Re库正则表达式表示方式介绍,这里面有个比较难理解的地方是字符串与正则表达式的双重转换

  • Re库主要函数介绍,这里主要介绍了re.match()、re.search()、re.findall()、re.sub()、re.compile()

  • 匹配目标获取与匹配模式

  • 贪婪匹配与非贪婪匹配
    本次分享到此结束,目前我们已经学了requests库下载目标网站源码,正则表达提取文本信息,下次将分享如何使用chrome浏览器对想要爬取的网站进行分析。

【小白学爬虫连载(3)】--正则表达式详细介绍相关推荐

  1. 【小白学爬虫连载(1)】-爬虫框架简介

    欢迎大家关注公众号[哈希大数据] [小白学爬虫连载(1)]-爬虫框架简介 [小白学爬虫连载(2)]--Requests库介绍 [小白学爬虫连载(3)]--正则表达式详细介绍 [小白学爬虫连载(4)]- ...

  2. 豆瓣网络爬虫-java网络爬虫[验证码模拟登陆]详细介绍

    目录 抓包介绍 解决验证码的思路 验证码地址拼接 爬虫实战 爬虫架构 model main 解析htmlparse 数据库操作程序db 近期,有人将本人博客,复制下来,直接上传到百度文库等平台. 本文 ...

  3. 小白学爬虫:Scrapy入门(四)

    摘要:从零开始写爬虫,初学者的速成指南! 上期我们理性的分析了为什么要学习Scrapy,理由只有一个,那就是免费,一分钱都不用花! 号:923414804群里有志同道合的小伙伴,互帮互助,群里有不错的 ...

  4. python数字规律分析_【小白学爬虫】用Python分析福彩3D|发现数字的秘密

    2).我们用chrome浏览器,分析一下网站的结构和源码 访问: http://kaijiang.zhcw.com/zhcw/inc/3d/3d_wqhg.jsp 跳转到: http://kaijia ...

  5. 小白学python爬虫_小白学爬虫——第一部分:简单学习Python

    学习目录 定义新函数 文件读写 数组 字符串 字典 定义新函数 **创一个小群,供大家学习交流聊天 如果有对学 python 方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀 ...

  6. 小白学爬虫——第一部分:简单学习Python

    学习目录 定义新函数 文件读写 数组 字符串 字典 定义新函数 **创一个小群,供大家学习交流聊天 如果有对学python方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀. ...

  7. 小白学爬虫---爬取中国房价工资比

    文章概要 这是一个比较简单的爬虫项目,但是牵扯到一些python的基础知识,所以如果你是零基础的同学,也不用着急,先对爬虫有一个初步的认识,培养一个爬虫的正确思路是最重要的 网站地址:https:// ...

  8. 小白学爬虫:网易云音乐歌单(一)

    从零开始写爬虫,初学者的速成指南! 介绍 什么是爬虫? 先看看百度百科的定义: 号:923414804群里有志同道合的小伙伴,互帮互助,群里有不错的视频学习教程和PDF! 简单的说网络爬虫(Web c ...

  9. AST反混淆实战:猿人学爬虫比赛第二题详细题解

    缘起 应星友要求,写下此文,哎,有钱能使鬼推磨. 实战地址: http://match.yuanrenxue.com/match/2 抓包分析 由于谷歌浏览器某些请求不会显示,建议使用火狐浏览器来抓包 ...

最新文章

  1. Java中一个令人惊讶的bug
  2. .net multi-threads synchronization : Use Lock effective
  3. 使用SSH上传部署WAR包到服务器
  4. 格力的“阵痛”与“头痛”
  5. 安卓版kindle电子书位置_安卓手机APP如何打开三种格式的电子书文件
  6. mysql中的double类型_MySQL中float、double、decimal三个浮点类型的区别与总结!
  7. 使用TDengine快速搭建运维监测系统
  8. 非常强大的射击动作游戏源码完整版
  9. 两道图片隐写的CTF题
  10. 短信API接口demo示例-C#/Message/Send
  11. 王者荣耀的皮肤,你会怎么测试?
  12. 数据库应用——MySQL+ATLAS+MMM高可用集群
  13. C标签是什么,为什么要使用C标签,有哪些常见的指令?
  14. DevOps落地实践:普元:PRIMETON DEVOPS
  15. Destroying assets is not permitted to avoid data loss.
  16. AppNode面板安装搭建教程
  17. DTC品牌如何冷启动?
  18. 国产自主内存产能发展迅猛
  19. LTspice 电路仿真入门
  20. [题解]CF662D

热门文章

  1. 广州区块链系统or积分联盟
  2. 致电子类专业学生的一封信
  3. ug齿条插件_UG8.0中怎么画齿条?
  4. 加工中心和数控机床故障解析大全!
  5. 2023最新国内外主流短信平台汇总
  6. 解决ViewPager和PagerAdapter中调用notifyDataSetChanged失效问题(从notifyDataSetChanged方法的源码入手,超详细)
  7. go语言的魔幻旅程03-控制结构
  8. 跟 Amazon 学入门级数据仓库架构
  9. 一入盲盒深似海,从此钱包是路人
  10. ICLR2022系列解读之三:一个新的目标检测网络结构范式GiraffeDet