python3 爬虫第三步 本文包你学会正则 不会就来锤我

简介

正则表达式是一种描述字符的一种方式,通过该方式,匹配字符串。
正则表达式是自由的,一个字符的含义往往代表着一类字符,通过多个正则正则符号的组合描述,可以使组成的正则表达式能够描述一类字符串。
在开发中,很多时候使用正则表达式描述一类字符串。
注:正则在编程中是通用的

在python中,使用re模块的match方法进行字符串与正则的匹配。语法如下:

re.match(pattern, string, flags=0)
  • pattern:正则表达式
  • string:需要进行匹配的字符串
  • flags:正则表达式的匹配方式

匹配成功返回匹配的对象,否则返回None。

正则基本使用

最简单的硬匹配
使用re模块前必须引入re,随后使用match方法进行正则匹配:

import reres = re.match("这是正则区域","这是正则区域")
print(res.group())

以上代码正则区域进行了比较硬核的匹配,直接用 这是正则区域 作为正则匹配,字符串内容也是 这是正则区域。匹配完后把匹配结果赋给res 变量,随后使用print输出(group方法会可以提取数据)。结果如下:
在这里插入图片描述
成功输出了匹配的内容。
接下来我把 这是正则区域 的字符串内容改为 这是字符串区域

res = re.match("这是正则区域","这是字符串区域")

结果如下:
在这里插入图片描述
由于匹配的值为None,所以输出错误。我们可以更改为如下方法:

import reres = re.match("这是正则区域","这是字符串区域")
if res:print(res.group())

这个时候就不会报错了,没有匹配就不会输出。

硬核的匹配方式学完了,接下来学一点别的方式。

\d

先介绍一个符号 \d,\d 可以匹配0-9的数字,在代码中可以写成如下形式:

import reres = re.match("\d","2")
if res:print(res.group())

结果如下:
在这里插入图片描述
如果后面的字符串为2则会匹配2,如果把2更换成字母则将不会输出任何值:

res = re.match("\d","a")

结果如下:
在这里插入图片描述
我们的代码还可以更加复杂一点,当然只是一点点不是亿点点:

res = re.match("今天星期\d","今天星期3")

这个时候不管是星期几,只要是数字都将会输出显示:
在这里插入图片描述

[]

接下来认识一下[],[]可以匹配方括号中列举的字符。例如在[]中列举1234,代码写为 [1234],代码如下:

import reres = re.match("今天星期[0123456789]","今天星期3")
if res:print(res.group())

以上代码是否还会匹配成功输出结果呢?当然是可以的,因为方括号中列举了0-9这几个数,并不是一些读者认为的0123456789是一个整体,这一串数字是以字符单个存在说明,并非整体,所以肯定会匹配成功并且显示:
在这里插入图片描述
以上代码列举了0-9这几个数字,写太长太过麻烦,可以写成以下形式,方便快捷且清晰:

res = re.match("今天星期[0-9]","今天星期3")

如果想列举字母a-z也没必要写太长,例如:

res = re.match("今天星期[a-z]","今天星期t")

结果如下:
在这里插入图片描述
如果你想大写也匹配呢?这个很简单,看如下示例:

res = re.match("今天星期[a-zA-Z]","今天星期T")

因为方括号里面的字符都是单个存在的,a-z描述的是a到z的字母,A-Z描述的是大写A到Z的字母,是一个整体,所以直接写成如上方式肯定是没问题的。
结果如下:
在这里插入图片描述

\w 与 \W

\w可以匹配 A-Z、a-z、0-9和下划线_。
\W可以匹配 非字母、非数字、非下划线以及非汉字,也就是和 \w反过来。
首先看\w:

import reres = re.match("\w","a")
if res:print(res.group())

由于\w是匹配 A-Z、a-z、0-9和下划线_所以匹配没问题,结果如下:
在这里插入图片描述
其它匹配将不再列出,都是一个意思。
尝试\W:

res = re.match("\W","+")

结果ok:
在这里插入图片描述

*、+、{}与?

进行到这如果还不增加一点难度想必就无趣了,现在开始使用一些字符对已学的单个字符匹配进行描述,使正则表达式能够匹配多个字符。
现在有一个字符串 房价租金1999 如何进行正则匹配?查看代码:

import reres = re.match(r"房价租金[0-9]*","房价租金1999")
if res:print(res.group())

仔细看,正则表达式 房价租金[0-9]*,前面的 房价租金 硬匹配了房价租金这几个字符串,之后我使用了一个中括号,里面的内容为匹配 0-9 其中任意一个数字,在一般情况下 [0-9] 匹配只能匹配一个,我在方括号后面增加了一个 *号。
*号的作用是描述它前面的一个正则表达式 [0-9] 匹配0次或者无限次,这里出现了1次,则匹配成功。结果如下:
在这里插入图片描述
当然0次也可以的,我们把代码更改为如下:

res = re.match("房价租金1*","房价租金")

以上代码使用*号去匹配1这个字符,如果不存在,正则表达式依旧会返回匹配对象,因为前面已经匹配成功了。*号0次没有也ok,所以依旧会输出:
在这里插入图片描述
如果把以上代码中的 * 号改为 + 号会出现什么情况?我们试一下:

res = re.match("房价租金1+","房价租金")

这时候将不会输出。+号表示前面的字符出现1次,为0可不行,那么我们匹配一下 房价租金1111 这个字符串看看效果:

res = re.match("房价租金1+","房价租金111111111")

结果如下:
在这里插入图片描述
那如果我想匹配固定次数如何?
这个时候就可以使用{}进行限定次数的匹配:

res = re.match("房价租金1{0}","房价租金111111111")

结果为:
在这里插入图片描述
当然代码也可以写成:

res = re.match("房价租金1{0,4}","房价租金111111111")

{0,4}中0为匹配的起始位置,4为结束位置,如果4这个结束位置不填,那么将会从0起始位置(其实位置可以写任意位置,如1,2,3…)匹配到无限次。

^与$

^表示从字符串头进行匹配,$表示配字符串结束。
现在开始来一个综合的挑战,匹配一个邮箱地址吧,这个在正常的需求中也是很常见的:

import reres = re.match("^\d+@\w+\.\w+",r"1234567@qq.com")
if res:print(res.group())

查看正则我们写为:^\d+@\w+.\w+
我们分解一下正则表达式的组成:

  • ^\d+:在最开头使用了一个^描述之后的一个正则描述为字符串开头。\d为数字,+号为匹配至少一个。连起来就是在字符串开头匹配一串数字。
  • @\w+:一串数字结束后,硬匹配一个@符号,邮箱都这样。之后\w表示匹配
    A-Z、a-z、0-9和下划线_(下划线我不懂,不过好像我见过有吧),由于邮箱有qq邮箱,163邮箱,谷歌等不同的邮箱,所以我就用\w了。由于匹配的不止一个,所以我用了+号进行之前的正则描述。
  • 、.\w+:最后进行了一个点 . 的硬匹配,在 . 前面加了一个\是因为需要转义,之后再匹配一个 \w,然后完事。 结果如下:

在这里插入图片描述
读者可以修改一下邮箱即可查看效果。

注意:以上邮箱的匹配形式并不是严谨的正则编写方式,请勿在实际项目中使用,在这里只是为了方便演示,请见谅。

以上的基础正则基本上在应用开发中已经够用了,接下来再扩展一下正则表达式的符号。

|与()

| 为一个或运算,|符号左右两边的正则都可以进行匹配,只要有一个匹配成功,那么整个正则匹配即为成功:

import rere_1="^\d+@qq\.\w+"
re_2="^\d+@163\.\w+"res = re.match(re_1+'|'+re_2,r"1234567@163.com")
if res:print(res.group())

在以上代码中在上一个案例中修改,其中正则不再赘述,毕竟都相差不大。以上代码中定义了两个变量 re_1 与 re_2,re_1 为匹配qq邮箱,re_2 为匹配163的邮箱,在进行匹配时,在正则中代码编写为 re_1+'|'+re_2,使用 | 符号使左右两边连接,随后进行判断。这个符号也就是或运算。结果如下:
在这里插入图片描述
()圆括号的作用是进行分组:

import rere_1="(^\d+)(@qq)(\.)(\w+)"res = re.match(re_1,r"1234567@qq.com")
if res:print("0",res.group(0))print("1",res.group(1))print("2",res.group(2))print("3",res.group(3))print("4",res.group(4))

以上代码是上一个示例中修改,re_1 的变化不大,使用圆括号为每一个块的正则分了组。之后使用group的时候传入参数 0、1、2、3、4 。0表示正则匹配出来的所有结果,1表示 (^\d+) 匹配的结果,2表示 (@qq) 匹配的结果,之后的序号以此类推。结果如下:
在这里插入图片描述
爬虫系列持续更新,欢迎关注、点赞、收藏。
下一篇将使用正则抓取房价。

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

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

相关文章

.NET性能优化-使用结构体替代类

前言我们知道在C#和Java明显的一个区别就是C#可以自定义值类型,也就是今天的主角struct,我们有了更加方便的class为什么微软还加入了struct呢?这其实就是今天要谈到的一个优化性能的Tips使用结构体替代类。那么使用结构体替代类有什么好处呢&…

ISE14.7兼容性问题集锦

一、 关于win8和win10不兼容性解决办法 (win7不会出现闪退的问题,按安装流程做完就可以直接使用了) 在安装目录下,我这里是D:\ISE_14.7\14.7\ISE_DS\ISE\lib\nt64中找到libPortability.dll和libPortabilityNOSH.dll两个文件夹&…

幼儿园调查过程怎么写_深圳全托幼儿园哪个好 幼儿园寄宿怎么报名

陪孩子一起阅读的精髓不是认字和背诵,亲子阅读的那些事 亲子阅读是当代的养育新潮流,但它还有更可贵的一面。 脾气再大的妈妈,都有温柔可爱的时刻,就是陪伴孩子阅读的时刻,曾经有一位在我看来算不上温柔的妈妈&#xf…

ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 目录 一、地理配准工具条简介 二、地理配准过程 1、加载数据(点击下载)提取码:v9y8 2、加载地理配准工具条 3、添加控制点 …

php基础教程 第二步 通俗易懂的学习变量、常量与数据类型

简介 变量、常量以及数据类型 在编程中,变量指一个存储值的一个盒子,或者说容器。例如一个箱子,用来放杂物,这个箱子就是一个容器,值就为杂物。容器可以分为很多类型,例如瓶子、被子、盒子等。值也有很多类…

可见光能量范围_JACS:游书力团队通过可见光促进的吲哚衍生物分子内去芳构化合成环丁烷稠合的四环吲哚螺环...

点击上方了解化学加VIP会员企业导读近日,中国科学院上海有机所游书力团队开发了一种可见光促进的吲哚衍生物分子内[22]环加成方法,可以极好的收率和立体选择性得到环丁烷稠合的四环吲哚螺环(Scheme 1,底部)。该成果近期发表在J. Am. Chem. So…

记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策

在经过了两年的准备,以及迁移了几个应用项目积累了让我有信心的经验之后,我最近在开始将团队里面最大的一个项目,从 .NET Framework 4.5 迁移到 .NET 6 上。这是一个从 2016 时开始开发,最多有 50 多位开发者参与,代码…

ArcGIS实验教程——实验一:ArcGIS软件的认识与使用

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 实验目录 第一节 Esri简介 1.1 ESRI简介 1.2 Esri产品发展历程 第二节 ArcGIS简介 2.1 ArcGIS简介 2.2 ArcGIS产品体系 第三节 Desktop简介 3.1 Desktop简介…

10分钟学会vue滚动行为

滚动行为 什么是路由的滚动行为 当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样 注意: 这个功能只在 HTML5 history 模式下可用。在这个模式下我们需要启动一个服务 我们用scrollBehavior 方法来做路由滚…

php基础教程 第三步 学习字符串及相关函数

字符串 上一节中我们学习了 php 变量、常量以及数据类型的一些概念。这一节中进一步学习数据类型中的字符串类型及其相关操作方法。 字符串指一串字符的合集。例如单个字符 a,单个字符 b,单个字符 c…这些 a、b、c 皆是字符;当把这些字符连…

Mirantis OpenStack fuel web 安装 使用

2019独角兽企业重金招聘Python工程师标准>>> MirantisOpenStack-4.0.iso的下载地址:http://pan.baidu.com/s/1dDsuzXf。下载之后使用虚拟机或者物理机安装都可以,我使用的是vmware。需要把NAT的自动分配ip功能关闭 1、创建虚拟机 &#xff08…

[图] DevOps:提速从研发到交付流程

你的产品要让用户等多久?制定需求、排期开发、部署调试……这些流程都再跑一遍?传统产品发布流程长,多分支、环境不一、人工操作导致容易出错。面对这些传统发布难题,DevOps才是正确的出路。

php基础教程 第四步 学习运算符

在前面的章节中,以及了解了一些运算法,接下来再讲解一些常规运算法。 加运算法,用来使左右两边的值或表达式进行加法计算。例如有一个变量$a,一个变量$b,它们的值都为9,$a$b为99等于10.。输出使用echo&…

JavaScript基础学习(七)—BOM

BOM(Browser Object Model): 浏览器对象模型。提供了独立于内容而与浏览器窗口交互的对象,BOM主要用于管理窗口和窗口之间的通讯。 一、Navigator对象 navigator对象通常用于获取浏览器和操作系统的信息。 navigator对象是window对象的属性,中文是&…

Spring初识

从上学期开始决心开始学习Spring,自己总是利用不好时间,到处瞎忙,结果浪费了好多时间。想着利用暑假的时间,专心看会儿书。最初我在Spring官网下载jar包的时候,忙会儿了半天愣是没找到下载的链接,瞬间觉得学…

Blazor University (17)使用 RenderFragments 模板化组件

原文链接:https://blazor-university.com/templating-components-with-renderfragements/使用 RenderFragments 模板化组件源代码[1]到目前为止,我们已经创建了基于参数生成 100% 渲染输出的组件,但组件并不总是那么简单。有时我们需要创建将…

php基础教程 第五步 逻辑控制

逻辑判断 在开发项目时,竟然会出现逻辑控制。例如当用户输入“hello”时你需要自动回复“hello 欢迎”,当用户设置的定时时间到达时,你需要提醒用户时间已经结束;再举个例子,在玩网络游戏时,用户控制的角色…

博图程序需要手动同步_贴吧求助帖博图实例单按钮控制灯的程序

接上一期在贴吧看见的求助帖(上图看得见水印),因为没人回复,发帖的楼主好像删除了帖子。结果我抽时间用博图15.1,S71200做了一个,希望给需要帮助的新人能够起到作用,感觉有用的话可以关注一下我的公众号低压电工&#…

php基础教程 第六步 学习数组以及条件判断switch补充

条件语句 switch 在上一节的学习中&#xff0c;学习了php的条件语句if。在php编程中进行条件判断还可以使用switch语句。switch语句语法如下&#xff1a; <?php switch (值或表达式) { case 值等于值1:当值等于值1时要执行的代码break; case 值等于值2:当值等于值2时要执…

dotnet-exec 小工具

dotnet-exec 小工具Intro在之前的文章中很多会有一些示例代码&#xff0c;这些代码一般都是一些很小的示例&#xff0c;尤其是介绍一些新特性的示例&#xff0c;基本上不会引用其他包&#xff0c;只有 SDK 就可以执行&#xff0c;对于这些示例&#xff0c;一般会每个实例单独一…