Python爬虫之正则表达式的使用教程详解


Posted in Python onOctober 25, 2018

正则表达式的使用

re.match(pattern,string,flags=0)

re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

参数介绍:

pattern:正则表达式

string:匹配的目标字符串

flags:匹配模式

正则表达式的匹配模式:

Python爬虫之正则表达式的使用教程详解

最常规的匹配

import re
content ='hello 123456 World_This is a Regex Demo'
print(len(content))
result = re.match('^hello\s\d{6}\s\w{10}.*Demo$$',content)
print(result)
print(result.group()) #返回匹配结果
print(result.span()) #返回匹配结果的范围

结果运行如下:

39
<_sre.SRE_Match object; span=(0, 39), match='hello 123456 World_This is a Regex Demo'>
hello 123456 World_This is a Regex Demo
(0, 39)

泛匹配

使用(.*)匹配更多内容

import re
content ='hello 123456 World_This is a Regex Demo'
result = re.match('^hello.*Demo$',content)
print(result)
print(result.group())

结果运行如下:

<_sre.SRE_Match object; span=(0, 39), match='hello 123456 World_This is a Regex Demo'>
hello 123456 World_This is a Regex Demo

匹配目标

在正则表达式中使用()将要获取的内容括起来

使用group(1)获取第一处,group(2)获取第二处,如此可以提取我们想要获取的内容

import re
content ='hello 123456 World_This is a Regex Demo'
result = re.match('^hello\s(\d{6})\s.*Demo$',content)
print(result)
print(result.group(1))#获取匹配目标

结果运行如下:

<_sre.SRE_Match object; span=(0, 39), match='hello 123456 World_This is a Regex Demo'>
123456

贪婪匹配

import re
content ='hello 123456 World_This is a Regex Demo'
result = re.match('^he.*(\d+).*Demo$',content)
print(result)
print(result.group(1))

注意:.*会尽可能的多匹配字符

非贪婪匹配

import re
content ='hello 123456 World_This is a Regex Demo'
result = re.match('^he.*?(\d+).*Demo$',content)
print(result)
print(result.group(1)) 

注意:.*?会尽可能匹配少的字符

使用匹配模式

在解析HTML代码时会有换行,这时我们就要使用re.S

import re
content ='hello 123456 World_This ' \
'is a Regex Demo'
result = re.match('^he.*?(\d+).*?Demo$',content,re.S)
print(result)
print(result.group(1))

运行结果如下:

<_sre.SRE_Match object; span=(0, 39), match='hello 123456 World_This is a Regex Demo'>
123456

转义

在解析过程中遇到特殊字符,就需要做转义,比如下面的$符号。

import re
content = 'price is $5.00'
result = re.match('^price.*\$5\.00',content)
print(result.group())

总结:尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行就用re.S

re.search(pattern,string,flags=0)

re.search扫描整个字符串并返回第一个成功的匹配。

比如我想要提取字符串中的123456,使用match方法无法提取,只能使用search方法。

import re
content ='hello 123456 World_This is a Regex Demo'
result = re.match('\d{6}',content)
print(result)
import re
content ='hello 123456 World_This is a Regex Demo'
result = re.search('\d{6}',content)
print(result)
print(result.group())

运行结果如下:

<_sre.SRE_Match object; span=(6, 12), match='123456'>

匹配演练

可以匹配代码里结构相同的部分,这样可以返回你需要的内容

import re
content = '<a title="2009年中信出版社出版图书" href="/doc/2703035-2853985.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank" data-log="old:2703035-2853885,new:2703035-2853985" data-cid="sense-list">2009年中信出版社出版图书</a>'
result = re.search('<a.*?new:\d{7}-\d{7}.*?>(.*?)</a>',content)
print(result.group(1))
2009年中信出版社出版图书
re.findall(pattern,string,flags=0)

搜索字符串,以列表形式返回全部能匹配的字串

import re
html ='''
<li>
<a title="网络歌曲" href="/doc/2703035-2853927.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank" data-log="old:2703035-2853885,new:2703035-2853927" data-cid="sense-list">网络歌曲</a>
</li>
<li>
<a title="2009年中信出版社出版图书" href="/doc/2703035-2853985.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank" data-log="old:2703035-2853885,new:2703035-2853985" data-cid="sense-list">2009年中信出版社出版图书</a>
</li>
'''
result = re.findall('<a.*?new:\d{7}-\d{7}.*?>(.*?)</a>',html,re.S)
count = 0
for list in result:
  print(result[count])
  count+=1
网络歌曲
2009年中信出版社出版图书
re.sub( pattern,repl,string,count,flags)

re.sub共有五个参数

三个必选参数 pattern,repl,string

两个可选参数count,flags

替换字符串中每一个匹配的字符串后替换后的字符串

import re
content = 'hello 123456 World_This is a Regex Demo'
content = re.sub('\d+','',content)
print(content)

运行结果如下:

hello  World_This is a Regex Demo
import re
content = 'hello 123456 World_This is a Regex Demo'
content = re.sub('\d+','what',content)
print(content)

运行结果如下:

hello what World_This is a Regex Demo
import re
content = 'hello 123456 World_This is a Regex Demo'
content = re.sub('(\d+)',r'\1 789',content)
print(content)

运行结果如下:

hello 123456 789 World_This is a Regex Demo

注意:这里\1代表前面匹配的123456

演练

在这里我们替换li标签

import re
html ='''
<li>
<a title="网络歌曲" href="/doc/2703035-2853927.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank" data-log="old:2703035-2853885,new:2703035-2853927" data-cid="sense-list">网络歌曲</a>
</li>
<li>
<a title="2009年中信出版社出版图书" href="/doc/2703035-2853985.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank" data-log="old:2703035-2853885,new:2703035-2853985" data-cid="sense-list">2009年中信出版社出版图书</a>
</li>
'''
html = re.sub('<li>|</li>','',html)
print(html)

运行结果如下,里面就没有li标签

<a title="网络歌曲" href="/doc/2703035-2853927.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank" data-log="old:2703035-2853885,new:2703035-2853927" data-cid="sense-list">网络歌曲</a>
<a title="2009年中信出版社出版图书" href="/doc/2703035-2853985.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank" data-log="old:2703035-2853885,new:2703035-2853985" data-cid="sense-list">2009年中信出版社出版图书</a>
compile(pattern [, flags])

该函数根据包含的正则表达式的字符串创建模式对象。可以实现更有效率的匹配

将正则表达式编译成正则表达式对象,以便于复用该匹配模式

import re
content = 'hello 123456 ' \
'World_This is a Regex Demo'
pattern = re.compile('hello.*?Demo',re.S)
result = re.match(pattern,content)
print(result.group()) 

运行结果如下:

hello 123456 World_This is a Regex Demo

综合使用

import re
html = '''
<div class="slide-page" style="width: 700px;" data-index="1">
    <a class="item" target="_blank" href="https://movie.douban.com/subject/26725678/?tag=热门&from=gaia">
      <div class="cover-wp" data-isnew="false" data-id="26725678">
        <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2525020357.jpg" alt="解除好友2:暗网" data-x="694" data-y="1000">
      </div>
      <p>
        解除好友2:暗网
          <strong>7.9</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/26916229/?tag=热门&from=gaia_video">
      <div class="cover-wp" data-isnew="false" data-id="26916229">
        <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2532008868.jpg" alt="镰仓物语" data-x="2143" data-y="2993">
      </div>
      <p>
        镰仓物语
          <strong>6.9</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/26683421/?tag=热门&from=gaia">
      <div class="cover-wp" data-isnew="false" data-id="26683421">
        <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2528281606.jpg" alt="特工" data-x="690" data-y="986">
      </div>
      <p>
        特工
          <strong>8.3</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/27072795/?tag=热门&from=gaia">
      <div class="cover-wp" data-isnew="false" data-id="27072795">
        <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2521583093.jpg" alt="幸福的拉扎罗" data-x="640" data-y="914">
      </div>
      <p>
        幸福的拉扎罗
          <strong>8.6</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/27201353/?tag=热门&from=gaia_video">
      <div class="cover-wp" data-isnew="false" data-id="27201353">
        <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2528842218.jpg" alt="大师兄" data-x="679" data-y="950">
      </div>
      <p>
        大师兄
          <strong>5.2</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/30146756/?tag=热门&from=gaia_video">
      <div class="cover-wp" data-isnew="false" data-id="30146756">
        <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530872223.jpg" alt="风语咒" data-x="1079" data-y="1685">
      </div>
      <p>
        风语咒
          <strong>6.9</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/26630714/?tag=热门&from=gaia">
      <div class="cover-wp" data-isnew="false" data-id="26630714">
        <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530591543.jpg" alt="精灵旅社3:疯狂假期" data-x="1063" data-y="1488">
      </div>
      <p>
        精灵旅社3:疯狂假期
          <strong>6.8</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/25882296/?tag=热门&from=gaia_video">
      <div class="cover-wp" data-isnew="false" data-id="25882296">
        <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2526405034.jpg" alt="狄仁杰之四大天王" data-x="2500" data-y="3500">
      </div>
      <p>
        狄仁杰之四大天王
          <strong>6.2</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/26804147/?tag=热门&from=gaia_video">
      <div class="cover-wp" data-isnew="false" data-id="26804147">
        <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2527484082.jpg" alt="摩天营救" data-x="1371" data-y="1920">
      </div>
      <p>
        摩天营救
          <strong>6.4</strong>
      </p>
    </a>
    <a class="item" target="_blank" href="https://movie.douban.com/subject/24773958/?tag=热门&from=gaia_video">
      <div class="cover-wp" data-isnew="false" data-id="24773958">
        <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2517753454.jpg" alt="复仇者联盟3:无限战争" data-x="1968" data-y="2756">
      </div>
      <p>
        复仇者联盟3:无限战争
          <strong>8.1</strong>
      </p>
    </a>
  </div>
'''
count = 0
for list in result:
  print(result[count])
  count+=1

运行结果如下:

('解除好友2:暗网', '7.9')
('镰仓物语', '6.9')
('特工', '8.3')
('幸福的拉扎罗', '8.6')
('大师兄', '5.2')
('风语咒', '6.9')
('精灵旅社3:疯狂假期', '6.8')
('狄仁杰之四大天王', '6.2')
('摩天营救', '6.4')
('复仇者联盟3:无限战争', '8.1')

总结

以上所述是小编给大家介绍的Python爬虫之正则表达式的使用教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
详解Python中break语句的用法
May 14 Python
Python实现比较两个列表(list)范围
Jun 12 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
Python用for循环实现九九乘法表
May 31 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
Python中修改字符串的四种方法
Nov 02 Python
在python里面运用多继承方法详解
Jul 01 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
PyCharm如何导入python项目的方法
Feb 06 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
python 抓取知乎指定回答下视频的方法
Jul 09 Python
python实现键盘控制鼠标移动
Nov 27 #Python
解决python 无法加载downsample模型的问题
Oct 25 #Python
python实现写数字文件名的递增保存文件方法
Oct 25 #Python
python hook监听事件详解
Oct 25 #Python
python根据list重命名文件夹里的所有文件实例
Oct 25 #Python
python学习之hook钩子的原理和使用
Oct 25 #Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 #Python
You might like
文件上传类
2006/10/09 PHP
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
python决策树之C4.5算法详解
2017/12/20 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
Python3列表List入门知识附实例
2020/02/09 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
四风问题自查报告剖析材料
2014/02/08 职场文书
婚前财产公证书
2014/04/10 职场文书
市场营销工作计划书
2014/05/06 职场文书
ktv好的活动方案
2014/08/17 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
升职自我推荐信范文
2015/03/25 职场文书
疾病证明书
2015/06/19 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript
【2·13】一图读懂中国无线电发展
2022/02/18 无线电