Python3 爬虫学习笔记 C06 【正则表达式】


Python3 爬虫学习笔记第六章 —— 【正则表达式】

文章目录

  • 【6.1】关于正则表达式
  • 【6.2】re.match() 方法
    • 【6.2.1】提取内容
    • 【6.2.2】通用匹配
    • 【6.2.3】贪婪匹配
    • 【6.2.4】非贪婪匹配
    • 【6.2.5】转义匹配
    • 【6.2.6】修饰符
  • 【6.3】re.search() 方法
  • 【6.4】re.findall() 方法
  • 【6.5】re.sub() 方法
  • 【6.5】re.compile() 方法


【6.1】关于正则表达式

正则表达式是对字符串操作的一种逻辑公式,用定义好的特定字符和这些特定字符的组合组成一个规则字符串,这个规则字符串原来表达对字符串的一种过滤逻辑,从而实现字符串的检索、替换、匹配验证等。Python 的 re 库提供了整个正则表达式的实现,包含五种方法:match、search、findall、sub、compile
常用的匹配规则:

模式描述
\w匹配字母、数字及下划线
\W匹配不是字母、数字及下划线的字符
\s匹配任意空白字符,等价于 [\t\n\r\f]
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9]
\D匹配任意非数字的字符
\A匹配字符串开头
\z匹配字符串结尾,如果存在换行,同时还会匹配换行符
\Z匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\G匹配最后匹配完成的位置
\n匹配一个换行符
\t匹配一个制表符
^匹配一行字符串的开头
$匹配一行字符串的结尾
.匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符
[…]用来表示一组字符,单独列出,比如 [amk] 匹配 a、m 或 k
[^…]不在 [] 中的字符,比如 匹配除了 a、b、c 之外的字符
*匹配 0 个或多个表达式
+匹配 1 个或多个表达式
?匹配 0 个或 1 个前面的正则表达式定义的片段,非贪婪方式
{n}精确匹配 n 个前面的表达式
{n, m}匹配 n 到 m 次由前面正则表达式定义的片段,贪婪方式
a|b匹配 a 或 b
( )匹配括号内的表达式,也表示一个组

【6.2】re.match() 方法

match() 方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配,就返回 None,在 match() 方法中,第一个参数传入正则表达式,第二个参数传入要匹配的字符串。

import recontent = 'This is a Demo_123 4567_I Love China'
print(len(content))
result = re.match('^This\s\w\w\s\w\s\w{5}\d{3}\s\w{6}', content)
print(result)
print(result.group())
print(result.span())

输出结果:

36
<_sre.SRE_Match object; span=(0, 25), match='This is a Demo_123 4567_I'>
This is a Demo_123 4567_I
(0, 25)

打印 result 结果是 SRE_Match 对象,表明匹配成功。SRE_Match 对象有两种方法:group() 方法可以输出匹配到的内容;span() 方法可以输出匹配的范围。

【6.2.1】提取内容

使用括号将想提取的子字符串括起来。括号实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,调用 group() 方法传入分组的索引即可获取提取的结果。

import recontent = 'This is a Demo_123 4567_I Love China'
result = re.match('^This\s\w\w\s\w\s(\w{5})\d{3}\s\w{6}', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

输出结果:

<_sre.SRE_Match object; span=(0, 25), match='This is a Demo_123 4567_I'>
This is a Demo_123 4567_I
Demo_
(0, 25)

【6.2.2】通用匹配

如果每个字符都用都用一个符号来匹配的话就显得比较麻烦,可以用 .*来匹配,. 可以匹配除换行符外的任意字符,* 代表匹配前面的字符无限次。

import recontent = 'This is a Demo_123 4567_I Love China'
result = re.match('^This.*China$', content)
print(result)
print(result.group())
print(result.span())

输出结果:

<_sre.SRE_Match object; span=(0, 36), match='This is a Demo_123 4567_I Love China'>
This is a Demo_123 4567_I Love China
(0, 36)

【6.2.3】贪婪匹配

import recontent = 'This is a Demo_1234567_I Love China'
result = re.match('^This.*(\d+).*China$', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

输出结果:

<_sre.SRE_Match object; span=(0, 35), match='This is a Demo_1234567_I Love China'>
This is a Demo_1234567_I Love China
7
(0, 35)

.* 为贪婪匹配,会匹配尽可能多的字符,所以 \d+ 只会匹配到最后一个数字,而不是所有的数字

【6.2.4】非贪婪匹配

import recontent = 'This is a Demo_1234567_I Love China'
result = re.match('^This.*?(\d+).*China$', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

输出结果:

<_sre.SRE_Match object; span=(0, 35), match='This is a Demo_1234567_I Love China'>
This is a Demo_1234567_I Love China
1234567
(0, 35)

.*? 为非贪婪匹配,会匹配尽可能少的字符,所以 \d+ 会匹配到所有的数字

【6.2.5】转义匹配

当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可。例如 . 可以用 \. 来匹配:

import recontent = '(博客)www.itrhx.com'
result = re.match('\(博客\)www\.itrhx\.com', content)
print(result)
print(result.group())

输出结果:

<_sre.SRE_Match object; span=(0, 17), match='(博客)www.itrhx.com'>
(博客)www.itrhx.com

【6.2.6】修饰符

修饰符用来解决换行、大小写等问题,较为常用的有 re.S 和 re.I。

修饰符描述
re.S使 . 匹配包括换行在内的所有字符
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^$
re.U根据 Unicode 字符集解析字符。这个标志影响 \w\W\b\B
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

示例:

import recontent = '''This is a Demo_1234567_I Love China'''
result = re.match('^This.*?(\d+).*China$', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

示例中 content 字段进行了换行处理,如果没有修饰符,就会报错:

Traceback (most recent call last):
NoneFile "F:/PycharmProjects/Python3爬虫/test.py", line 7, in <module>print(result.group())
AttributeError: 'NoneType' object has no attribute 'group'

添加 re.S 修饰符后即可匹配成功:

import recontent = '''This is a Demo_1234567_I Love China'''
result = re.match('^This.*?(\d+).*China$', content, re.S)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

输出结果:

<_sre.SRE_Match object; span=(0, 46), match='This is a Demo_1234567\n          _I Love China'>
This is a Demo_1234567_I Love China
1234567
(0, 46)

【6.3】re.search() 方法

match() 方法只能从字符串的开头开始匹配,一旦开头不匹配,那么整个匹配就失败了,match() 方法更适合用来检测某个字符串是否符合某个正则表达式的规则,而 search() 方法则会扫描整个字符串并返回第一个成功的匹配

import recontent = 'This is a Demo_1234567_I Love China'
result = re.search('a.*?(\d{5})', content)
print(result)
print(result.group(1))

输出结果:

<_sre.SRE_Match object; span=(8, 20), match='a Demo_12345'>
12345

【6.4】re.findall() 方法

search() 方法则会扫描整个字符串,但是返回的是第一个成功的匹配,而 findall() 方法将会返回所有成功的匹配

import rehtml = '''<div id="songs-list"><h2 class="title"> 民谣 </h2><p class="introduction">民谣歌曲列表</p><ul id="list" class="list-group"><li data-view="2"> 七里香 </li><li data-view="7"><a href="/2.mp3" singer="赵雷"> 理想 </a></li><li data-view="4" class="active"><a href="/3.mp3" singer="许巍"> 像风一样自由 </a></li><li data-view="6"><a href="/4.mp3" singer="安与骑兵"> 红山果 </a></li><li data-view="5"><a href="/5.mp3" singer="薛之谦"> 意外 </a></li><li data-view="5"><a href="/6.mp3" singer="马頔"> 但南山南 </a></li></ul></div>'''
results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
print(results)
print(type(results))
for result in results:print(result)print(result[0], result[1], result[2])

输出结果:

[('/2.mp3', '赵雷', ' 理想 '), ('/3.mp3', '许巍', ' 像风一样自由 '), ('/4.mp3', '安与骑兵', ' 红山果 '), ('/5.mp3', '薛之谦', ' 意外 '), ('/6.mp3', '马頔', ' 但南山南 ')]
<class 'list'>
('/2.mp3', '赵雷', ' 理想 ')
/2.mp3 赵雷  理想 
('/3.mp3', '许巍', ' 像风一样自由 ')
/3.mp3 许巍  像风一样自由 
('/4.mp3', '安与骑兵', ' 红山果 ')
/4.mp3 安与骑兵  红山果 
('/5.mp3', '薛之谦', ' 意外 ')
/5.mp3 薛之谦  意外 
('/6.mp3', '马頔', ' 但南山南 ')
/6.mp3 马頔  但南山南 

【6.5】re.sub() 方法

与字符串的 replace() 方法类似,sub() 方法可以对文本进行修改,sub() 方法第一个参数为匹配对象,第二个参数为替换成的字符串,如果要去掉匹配对象的话,可以赋值为空,第三个参数为原来的字符串

import recontent = '87dsf4as2w4jh1k4kdl4'
result = re.sub('\d+', '', content)
print(result)

输出结果:

dsfaswjhkkdl

【6.5】re.compile() 方法

compile() 方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用

import recontent1 = '北京时间:2019-08-24 18:30'
content2 = '伦敦时间:2019-08-24 11:30'
content3 = '巴黎时间:2019-08-24 12:30'
content4 = '外星时间:9019-99-66 50:30'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
result4 = re.sub(pattern, '', content4)
print(result1, result2, result3, result4)

利用 compile() 方法将正则表达式编译成一个正则表达式对象,以便复用,然后用 sub() 方法去掉具体时间
输出结果:

北京时间:2019-08-24  伦敦时间:2019-08-24  巴黎时间:2019-08-24  外星时间:9019-99-66 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sharepoint学习笔记—Site Definition系列-- 3、创建ListDefinition

创建一个List Definition有多条途径&#xff0c;这里由于我们要基于前面的用户自定义Content Type来创建一个List Defintion&#xff0c;所以我们就需要使用到List Definition From Content Type模板。 这里先大致描述如何创建List Definition&#xff0c;然后重点介绍一下Li…

Python3 爬虫学习笔记 C07 【解析库 lxml】

Python3 爬虫学习笔记第七章 —— 【解析库 lxml】文章目录【7.1】关于 lxml【7.2】使用 XPath【7.3】查找所有节点【7.4】查找子节点【7.5】查找父节点【7.6】属性匹配【7.7】文本获取【7.8】属性获取【7.9】一个属性包含多个值的匹配【7.10】多个属性匹配一个节点【7.11】按顺…

Sharepoint学习笔记—error处理-- The user does not exist or is not unique.

看到网上不少人遇到过这种类似的错误&#xff0c;而产生这种错误的原因也有多种&#xff0c;我产生此错误的背景是在试图通过ECMAscript对象模型把一个User添加到某个指定的Group中时遇到的。 问题1.当我试图把一个User添加到Sharepoint的某个指定的Group&#xff0c;…

Python3 爬虫学习笔记 C08【解析库 Beautiful Soup】

Python3 爬虫学习笔记第八章 —— 【解析库 Beautiful Soup】文章目录【8.1】关于 Beautiful Soup【8.2】Beautiful Soup 的基本使用【8.3】节点选择器【8.3.1】元素选择【8.3.2】提取信息【8.3.3】嵌套选择【8.3.4】关联选择【8.4】方法选择器【8.4.1】find_all() 方法【8.4.2…

Sharepoint学习笔记—Ribbon系列

为便于查阅&#xff0c;这里整理并列出了我的Sharepoint学习笔记中涉及Ribbon开发的关文章&#xff0c;有些内容可能会在以后更新。 Sharepoint学习笔记—Ribbon系列-- 1. Ribbon的架构 Sharepoint学习笔记—Ribbon系列-- 2. 在Ribbon中添加新Tab Sharepoint学习笔记—Ribbo…

Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】

Python3 爬虫学习笔记第九章 —— 【数据储存系列 — 文件储存】文章目录【9.1】TXT 文本存储【9.1.1】基本示例【9.1.2】打开方式【9.2】JSON 文件存储【9.2.1】对象和数组【9.2.2】读取 JSON【9.2.3】写入 JSON 文件【9.3】CSV 文本存储【9.3.1】写入【9.3.2】读取用解析器解…

Knockout学习笔记之二($root,$parent及$data的区别)

以下是我从Google上找到的一个例子&#xff0c;非常生动形象&#xff0c;我修改了部分代码&#xff0c;具体内容如下&#xff1a; 对于$root 与$parent的区别&#xff1a; $root refers to the view model applied to the DOM with ko.applyBindings;译&#xff1a;$root 是指…

GitHub 学生认证,申请 GitHub 学生包

GitHub 面对学生推出了学生认证服务&#xff0c;通过认证后就可以得到学生包&#xff0c;学生包大概有十几项优惠&#xff0c;包括 DATADOG Pro 帐户、免费两年的10台服务器&#xff0c;Icons8 3个月的带图标&#xff0c;照片&#xff0c;插图和音乐订阅服务、JETBRAINS 专业桌…

Sharepoint学习笔记—架构系列

为便于查阅&#xff0c;这里整理并列出了我的Sharepoint学习笔记中涉及架构方面的有关文章&#xff0c;有些内容可能会在以后更新。 Sharepoin学习笔记—架构系列-- Sharepoint的网页(Page)&#xff0c;网页解析(Parsing)与解析安全处理(Security) Sharepoin学习笔记 —架构…

Python3 使用 pymysql 连接 MySQL 建表时出现 Warning3719 UTF8 警告

在学习 Python3 爬虫关系型数据库储存时&#xff0c;利用 pymysql 连接 MySQL 建表&#xff0c;测试用的代码如下&#xff0c;第一句 SQL 用于获取当前 MySQL 的版本信息&#xff0c;第二句 SQL 执行创建 spiders 数据库的操作&#xff0c;如果程序代码正确&#xff0c;将会输出…

Sharepoin学习笔记—架构系列--01 Sharepoint的网页(Page),网页解析(Parsing)与解析安全处理(Security)

Microsoft SharePoint Foundation 中主要有两种类型的页面&#xff0c;分别是应用程序页(Application Page) 和网站页(Site Page)。 应用程序页(Application Page) 和网站页(Site Page)都从同一母版页继承其布局。 应用程序页(Application Page)与传统的 Microsoft ASP.NET 3.5…

完美解决 bash: hexo: command not found

背景介绍&#xff1a;有好几天没动过 Hexo 博客了&#xff0c;今天准备更新的时候输入 hexo s&#xff0c;报错 bash: hexo: command not found&#xff0c;这是啥情况&#xff1f;以前都好好的&#xff0c;想了一下&#xff0c;大概是这几天折腾各种 Python 库的原因&#xff…

Sharepoin学习笔记 —架构系列--02 Sharepoint的处理(Process)与执行模型(Trust Model) 1

Sharepoint210有四种执行模型: 1、完全信任执行模型(Full Trust) 2、Bin/CAS 执行模型 &#xff08;1与2都属于场解决方案&#xff09; 3、沙盒执行模型(Sand Box) 4、 混合执行方法&#xff08;Hybrid Approach&#xff09; Sharepoint最简单的处理模型就是一个完整的Asp.net应…

Python3 爬虫学习笔记 C10【数据储存系列 — MySQL】

Python3 爬虫学习笔记第十章 —— 【数据储存系列 — MySQL】文章目录【10.1】MySQL 基本操作语句数据库操作表操作表的结构表的数据【10.2】Python 连接 MySQL【10.3】创建表【10.4】插入数据【10.5】更新数据【10.6】删除数据【10.7】查询数据【10.8】实战训练 — 爬取CSDN博…

Sharepoin学习笔记—架构系列--03 Sharepoint的处理(Process)与执行模型(Trust Model) 2

上文我们了解了一个外部Http Request进入IIS 工作进程(W3WP)的处理与执行信任模型&#xff0c;这个阶段是Sharepoint的四种执行模型都必须经过的处理阶段&#xff0c;其中Sharepoint场解决方案与任何 ASP.NET 应用程序一样就是在 IIS 工作进程(w3wp)中运行的&#xff0c;所以上…

Python3 爬虫学习笔记 C11【数据储存系列 — MongoDB】

Python3 爬虫学习笔记第十一章 —— 【数据储存系列 — MongoDB】文章目录【11.1】关于 MongoDB【11.2】MongoDB 基本操作语句【11.3】连接 MongoDB【11.4】指定数据库【11.5】指定集合【11.6】插入数据【11.6】数据查询【11.7】数据计数【11.8】数据排序【11.9】数据偏移【11.…

Sharepoin学习笔记—架构系列--04 Sharepoint的四种执行模型 1

Sharepoint210有四种执行模型 1、完全信任执行模型(Full Trust) 2、Bin/CAS 执行模型 &#xff08;1与2都属于场解决方案&#xff09; 3、沙盒执行模型(Sand Box) 4、 混合执行方法 (Hybrid Approach) 下面分别来看看它们是怎么回事 一、场解决方案 场解决方案是在 Share…

Python3 爬虫学习笔记 C12【验证码对抗系列 — 图形验证码】

Python3 爬虫学习笔记第十二章 —— 【验证码对抗系列 — 图形验证码】文章目录【12.1】关于普通图形验证码【12.2】tesserocr 库识别验证码【12.3】pytesseract 库识别验证码【12.4】验证码处理【12.5】tesserocr 与 pytesserocr 相关资料【12.1】关于普通图形验证码 普通图形…

Sharepoin学习笔记—架构系列--05 Sharepoint的四种执行模型 2

上一篇我们看了场解决方案与沙盒方案两种执行模型&#xff0c;其中场解决方案包括有完全信任方式与Bin/CAS方式两种&#xff0c;这里让我们继续来看看最后一个执行模型&#xff0c;即混合模型(或混合模式)。 三、混合模式&#xff08;hybrid approaches&#xff09; 所谓混合模…

Python3 爬虫学习笔记 C13【验证码对抗系列 — 滑动验证码】

Python3 爬虫学习笔记第十三章 —— 【验证码对抗系列 — 滑动验证码】文章目录【13.1】关于滑动验证码【13.2】滑动验证码攻克思路【13.3】模拟登录 bilibili — 总体思路【13.4】主函数【13.5】初始化函数【13.6】登录函数【13.7】验证码元素查找函数【13.8】元素可见性设置函…