常见匹配模式:

re.match

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

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

最常规的匹配

import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu\s\d\d\d\s\d{3}\s\w{6}.*e$',content)
>>> result
<_sre.SRE_Match object; span=(0, 20), match='lu 156 156 shuai_ ke'>
# 我们来看,这返回的对象是什么
>>> print(result.span()) # 长度范围
(0, 20)
>>> print(len(content))
20
>>> print(result.group()) # 返回匹配结果
lu 156 156 shuai_ ke

范匹配

>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu.*ke$',content) # 贪婪匹配,尽可能多的匹配
>>> result
<_sre.SRE_Match object; span=(0, 20), match='lu 156 156 shuai_ ke'>
>>> result.group()
'lu 156 156 shuai_ ke'
>>> result.span()
(0, 20)

匹配目标

>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu\s(\d+)\s(\d+).*ke$',content)
>>> result
<_sre.SRE_Match object; span=(0, 20), match='lu 156 156 shuai_ ke'>
>>> result.group(1) # 输出第一个括号匹配的内容
'156'
>>> result.group(2) # 输出第一个括号匹配的内容
'156'

 贪婪匹配

>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu.*(\d+).*ke$',content)
>>> result.group()
'lu 156 156 shuai_ ke'
>>> result.group(1)
'6'
# 运行结果只匹配到了一个字符6,前面的1,5全被.*匹配到了
# 这就是前面说的,贪婪模式,尽可能多的匹配
# re.match('^lu.*(\d+).*ke$',content)这个正则有一项(\d+),也就是说最少得匹配一个数字

 非贪婪模式匹配

>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu.*?(\d+).*ke$',content)
>>> result
<_sre.SRE_Match object; span=(0, 20), match='lu 156 156 shuai_ ke'>
>>> result.group(1)
'156'# 这个?会指定为非贪婪模式匹配,匹配尽可能少的字符
# ?后有个(\d+),也就是当看到后面出现了数字就会把停止前面的匹配

匹配模式 

import re
content = 'lu 156 156 shuai_ ke
is a good boy'
result = re.match('^lu.*?(\d+).*?boy$',content)
print(result)
None# .匹配除换行符以外任意字符
result = re.match('^lu.*?(\d+).*?boy$',content,re.S)

 转义

>>> import re
>>> content = 'price is $5.00'
>>> result = re.match('price is $5.00',content)
>>> result
>>> result = re.match('price is \$5\.00',content)
>>> result
<_sre.SRE_Match object; span=(0, 14), match='price is $5.00'># \  转义符

总结:

  1. 尽可能使用范匹配模式
  2. 使用括号得到匹配目标
  3. 尽量使用非贪婪模式,有换行符就用re.S

re.search

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

>>> import re
>>> content = 'RiOxA 2549 XWTh_pPJ'
>>> result = re.match('R.*?(\d+).*?J$',content)
>>> result
<_sre.SRE_Match object; span=(0, 19), match='RiOxA 2549 XWTh_pPJ'>
>>> result = re.match('i.*?(\d+).*?J$',content)
>>> result
>>> # re.match如果第一个字符是不匹配的,那么就不能正常进行匹配
>>> result = re.search('i.*?(\d+).*?J$',content)
>>> result
<_sre.SRE_Match object; span=(1, 19), match='iOxA 2549 XWTh_pPJ'>

练习:

为了对新人视感友好,我将这段HTML进行了进行了简化,提取感兴趣的内容

<div id="dynamicnews"><ul class="widget-tabbed-comments"><li class="widget-avatar">姓夏 on <a href="https://www.mtyyw.com/353/comment-page-7/#comment-89112">世界三大禁曲之《黑色星期天》</a></li><li class="widget-avatar">李先森 on <a href="https://www.mtyyw.com/20096/comment-page-1/#comment-89111">不要去试探和考验人性,尤其是对身边的人</a></li><li class="widget-avatar">xh on <a href="https://www.mtyyw.com/17854/comment-page-1/#comment-89110">你了解我吗?我真想再一次认识你</a></li><li class="widget-avatar">蝶衣诗词 on <a href="https://www.mtyyw.com/20041/comment-page-1/#comment-89107">一花一世界 - 李志辉</a></li><li class="widget-avatar">邓 on <a href="https://www.mtyyw.com/20050/comment-page-1/#comment-89104">「豆瓣2018年度读书榜单」电子书下载</a></li></ul>
</div>
import recontent = '<div id="dynamicnews"> \n \<ul class="widget-tabbed-comments"> \n\<li class="widget-avatar">\n\姓夏 on <a href="https://www.mtyyw.com/353/comment-page-7/#comment-89112">世界三大禁曲之《黑色星期天》</a>\n\</li>\n\<li class="widget-avatar">\n\李先森 on <a href="https://www.mtyyw.com/20096/comment-page-1/#comment-89111">不要去试探和考验人性,尤其是对身边的人</a>\n\</li>\n\<li class="widget-avatar">\n\xh on <a href="https://www.mtyyw.com/17854/comment-page-1/#comment-89110">你了解我吗?我真想再一次认识你</a>\n\</li>\n\<li class="widget-avatar">\n\蝶衣诗词 on <a href="https://www.mtyyw.com/20041/comment-page-1/#comment-89107">一花一世界 - 李志辉</a></li>\n\<li class="widget-avatar">\n\邓 on <a href="https://www.mtyyw.com/20050/comment-page-1/#comment-89104">「豆瓣2018年度读书榜单」电子书下载</a>\n\</li>\n\</ul>\n\
</div>'result = re.search('<li.*?>(.*?)<a href="(.*?)">(.*?)</a>',content,re.S)
print(result.group(1),result.group(2),result.group(3))

re.findall

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

还是用上面的例子

result = re.findall('<li.*?>(.*?)<a href="(.*?)">(.*?)</a>',content,re.S)
print(result) # 发现有个问题,在HTML中存在很多换行符或空格for res in result:res[1].split()res[2].split()res[0].split()

re.sub

替换字符串中每一个匹配的子串后,返回替换的字符串

import re
content = 'lu 156 156 shuai_ ke'result = re.sub('\d+', 'number', content)
print(result)#  lu number number shuai_ keresult = re.sub('(\d+)', r'\1 651', content)
print(result)# lu 156 651 156 651 shuai_ ke

re.compile

将正则字符串编译成正则表达式对象

import re
content = 'fdfsdf 2342 sfsdg \n \sdfdf sfdo'
pattern = re.compile('fd.*?do', re.S)
result = re.match(pattern, content)
print(result)# 减少代码复用

爬爬爬,爬虫之数据提取——正则表达式相关推荐

  1. 爬虫之数据提取响应内容的分类

    爬虫之数据提取响应内容的分类 在发送请求获取响应之后,可能存在多种不同类型的响应内容:而且很多时候,我们只需要响应内容中的一部分数据 结构化的响应内容 json字符串   [高频出现] 可以使用re. ...

  2. edge新版 能够正则式_Python爬虫七 数据提取之正则

    数据提取之正则,主要用到的re模块. 一.正则表达式 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑. 二.正则表达式的常见语法 正 ...

  3. Python爬虫的数据提取,一篇博客就搞定啦!

    数据提取 目录 数据提取 XPath语法和lxml模块 XPath 什么是XPath XPath开发工具 XPath语法 选取节点: 谓语: 通配符 选取多个路径: 运算符: 总结 使用方式 需要注意 ...

  4. 爬虫常用数据提取方式:正则、xpath、beautifulsoup

    文章目录 1.正则re 2.xpath 2.1 定位 2.1.1 xpath中选取节点的路径表达式 2.1.2 xpath谓语,即[ ]中的内容 2.1.3 选取未知节点 2.1.4 选择多个路径 2 ...

  5. 磨刀霍霍:爬爬爬爬爬爬虫爬起来~

    写在前面的叨叨 折腾了这么久,我终于在喝完一听快乐肥宅水后下定决心来学习写爬虫了. 目标很简单,因为我想要爬一下"证券化率",然后可视化输出结果. 证券化率的基础就是上市公司的总市 ...

  6. 爬虫之数据提取jsonpath模块的使用场景和使用方法

    1. jsonpath模块的使用场景 如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的.jsonpath模块就能解决这个痛点. jsonpath可以按照key对p ...

  7. java爬虫工具xpath提取_爬虫 xpath (数据提取)

    xpath 是数据提取的一种常用的方法 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. 在 XPath 中,有七种类型的节点:元素.属性 ...

  8. Python爬虫之(七)数据提取-正则表达式

    提取数据 在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 正则表达式是对字符串操作的一种逻辑公 ...

  9. python爬虫科研数据提取_python爬虫数据提取四之pyquery

    1 pyquery 简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便 2 pyquery基本用法 2.1 安装 pip insta ...

最新文章

  1. Android线程实例讲解
  2. 应用虚拟化技术的五大理由
  3. SSPL的MongoDB再被抛弃,GUN Health也合流PostgreSQL
  4. HDU1045 Fire Net 递归回溯
  5. 如何创建并发布Google Earth KML 地标文件?
  6. .NET调用Oracle存储过程,使用数组类型的参数(如ArrayList)
  7. [cocos2d-x][apk打包][Fatal signal 11][andriod]Eclipse编译Fatal signal 11报错-都是字符赋值惹的祸...
  8. 一张图看透微信公众号、企业号、小程序
  9. Platform.Uno介绍
  10. 【转】成为Java顶尖程序员 ,看这10本书就够了
  11. LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
  12. matlab画无量纲速度分布,麦克斯韦分布与概率论中典型分布的比较教学
  13. Unreal3 window下内存管理实现详解
  14. 如何拿到半数面试公司Offer——我的Python求职之路
  15. C/C++线程与多线程工作笔记0005---c/c++中的wchar_t类型
  16. SAP License:对煤化工行业的几点思考
  17. windows上安装Metasploit Framework 4.0
  18. NEC学习 ---- 布局 -两列, 右侧定宽,左侧自适应
  19. 软件测试人员必备工具介绍--如何滚屏抓取图片-SnagIt篇(图)
  20. postman安装html插件安装,Postman 安装与更新

热门文章

  1. web网页设计与开发:个人明星介绍主题网站设计——张艺兴(10页) HTML+CSS+JavaScript 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 网页设计作业...
  2. 使用Kettle进行数据同步(增量)
  3. kali配置桥接模式
  4. 2021蓝牙耳机种草推荐,五款出差通勤必备高音质蓝牙耳机
  5. [虚拟机] 添加Hyper-v功能后,物理网卡不能设置IP?
  6. Python3 快手视频爬取
  7. 企业微信SDK接口API调用-触发推送企业微信微信好友
  8. 程序员半年找不到工作就因为大龄?太歧视了,气人
  9. 视频标清、高清、全高清的分类分辨率码率帧率参考(附图)
  10. 易语言反截图_[原创]反截图技术的原理及简单实现