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…

调优 PHP

调优 PHP PHP 是运行应用程序代码的引擎。应该仅安装计划使用的那些模块,并配置您的 Web 服务器,使之仅为脚本文件(通常是以 .php 结尾的那些文件)使用 PHP,而非所有静态文件。操作码缓存 请求一个 PHP 脚本时&#x…

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

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

cocos2d-x知识总结

1. CCMoveTo动作运行多次,位置会发生诡异的变化,比如变成目标位置的几倍。解决办法,确保每次CCMoveTo之前停止之前的动作。 2. 在onEnter()函数中,忘记调用父类的onEnter()函数会导致动画等无效。还有在init()函数中,谨…

数据结构之判断一棵树是不是完满二叉树

1 完满二叉树 除了叶子结点之外的每一个结点都有两个孩子结点。 如下是完满二叉树 12 34 56 7 2 分析 我们按层(queue)遍历数,如果发现左子树为空右子树不为空 或者 左子树不为空右子树为空 的情况下直接返回…

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

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

ArcGIS实验教程——实验三:矢量数据采集与编辑(矢量化)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 扫描矢量化是常见的GIS数据采集方法之一,在实际工作中很常见。有些人觉得数字化就是听着歌点鼠标,其实不然。数字化是GISer的基本功。掌握数字化的基本方法,熟练的进行数字化在实际工作中显得尤为…

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

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

章鱼黑的第一篇博客~

Part One:结缘计算机 推荐博客:https://book.douban.com/subject/4006425/discussion/22803961/ 从踏入大学的第一天,我就对这一专业充满了好奇与兴趣。我之所以会选择计算机这个专业,是因为从小对电脑的喜爱,再加上现…

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

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

1Android系统移植与驱动开发概述

1、Android系统架构分为四层,从下至上依次为Linux内核层,C/C代码库、Android SDK API、应用程序,要熟悉每一层的内容以及功能; 2、Android移植分为应用移植和系统移植,系统移植的主要工作是移植Linux驱动和移植HAL&…

数据结构之堆排序

1 堆排序 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点,我们可以理解构建的堆是 完全二叉树 ,它们的下标有如下性质 完全二叉树还有这…

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 皆是字符;当把这些字符连…

冲刺第五天

今天做了什么? 今天学习了一下jQuery的元素获取,操作,attribute方法。 明天要做什么? 明天我准备调出程序算法进行测试。 遇到的困难? 还不懂jQuery的一些ui操作。 转载于:https://www.cnblogs.com/kt97458/p/5444148.…

ASP.NET CORE MVC使用SCD(独立部署)发布

简介Self-contained deployments (SCD), 生成一个可自己执行的文件以及所有依赖, 比如一个xxx.exe和一大堆dll, 直接运行即可, 不需要操作系统安装.net core 运行时步骤1、首先创建一个ASP.NET CORE MVC项目2、右击项目&#xff0c;点击编辑xxx.csproj&#xff0c;在下编辑<…

Mirantis OpenStack fuel web 安装 使用

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