Products
GG网络技术分享 2025-03-18 16:14 2
如题,我想要匹配开头为b的字符串是这么写:
rex = re.compile(\'^b.*\')
那我想要匹配开头为a或b或c的该怎么写呢?
rex = re.compile(\'^[abc].*\'),使用[]可以任意匹配里面的字符。
^[abc].*
看看方括号的用法
[]括起来的为一个字符集,正则表达会匹配字符集中任一个,[abc]表示匹配abc中任一个或多个,除此之外^表示开始,而字符集中用^表示否定,所以[^abc]则表示不匹配abc。这里就应该是^[abc].*
网页上的信息爬下来之后,关键的一步就是对目标信息进行提取,解析方法通常会用到正则表达式,可以方便的提取网页里非结构化的数据。
网络爬虫中用的较多的正则表达式有:
一、正则表达式的基本知识
1、概念
是对字符串操作的⼀种逻辑公式,就是⽤事先定义好的⼀些特定字符及这些特定字符的组合,组成⼀个“规则字符串”,这个“规则字符串”⽤来表达对字符串的⼀种过滤逻辑。
2、正则表达式组成
3、基本用法
1)元字符
元字符是构造正则表达式的一种基本元素,常用的元字符有:
2)重复限定符
为了处理一堆连七八糟而且重复的问题,利用正则表达四中一些重复限定符,把重复部分用合适的限定符代替。常用的限定符:
3)分组
Python的re模块有⼀个分组功能,所谓的分组就是去已经匹配到的内容再筛选出需要的内容,相当于⼆次过滤。
实现分组靠圆括号(),⽽获取分组的内容靠的是group()、groups()。
4)转义
如果要匹配的字符串中本身就包含小括号的情况,正则表达式提供了转义的方式,也就是要把这些元字符、限定符或者关键字转义成普通的字符,在转义的字符前加个“\\”即可。
注意区分“\\”与“/”的区别;
5)条件或
正则用符号|来表示或,也叫做分支条件,当满足正则里的分支条件的任何一种条件时,都会当成是匹配成功。如例:
6)区间
正则提供一个元字符中括号[ ] 来表示区间条件,如例:
小结:
正则表达式只能处理字符串,用于模糊匹配;
正则表达式的区间是闭区间;
正则表达式的匹配方式:正则项 被包含于 字符串 时均可匹配 , 可以用 ^ $ 来具体匹配正则项;
python需要插入 re 模块才能使用正则表达式
正则表达式的基本用法就介绍到这里,它还有非常多的知识点以及元字符,在此只列举了部分元字符和语法来讲,具体的语法知识点讲解可戳下方教程视频↓↓
<Python学习交流群 Python基础语法学习资源下载>
4、匹配IP地址的正则表达式
IP地址由4断组成,每段0-255,由’.'分割,如210.134.3.123
第一步:\\d+.\\d+.\\d+.\\d+,不考虑长度
第二步:\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}考虑了长度
第三步:分割
0-99:[1-9]?\\d
100-199:1\\d{2}
200-249:2[0-4]\\d
250-255:25[0-5]
组合:(([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5]).){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])
5、可选标志(用于控制正则表达式的匹配方式)
正则表达式可以包含一些可选标志修饰符来控制匹配的模式,修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定,如 re.I | re.M 被设置成 I 和 M 标志:
二、Re库的基本使用
在Python中使用正则需要引入re模块,包含了正则表达式的所有功能,这一块的学习是掌握爬虫解析重要的一步之一,了解完基础知识之后,就可以顺着建立的学习路径,一路升级打怪。
下方的思维导图及相关的Python爬虫资料可进群添加群管理免费领取。
<Python学习交流群 Python爬虫学习资料获取>
1、基本介绍
2、Re库的主要功能函数
匹配的方法有:.findall()、.seach()、.match() ,注意它们的区别;
compile
函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表达式匹配和替换。
1)re.match() 方法
re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None。
参数说明:
flags正则表达式使用时的控制标记:
re.match() 方法若匹配成功,返回一个匹配的对象,否则返回 None。可以用 group(num) 或 groups() 匹配对象函数来获取匹配表达式,匹配对象方法如下:
group(num=0):匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups():返回一个包含所有小组字符串的元组,从1到所含的小组号。
match对象的属性:
match对象的常用方法:
2)re.search() 方法
re.search() 方法扫描整个字符串并返回第一个成功的匹配;
参数说明:
同样可以用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。
3)re.match() 与 re.search() 的区别
如例:
输出:
3、re库的贪婪匹配和最小匹配
如例:match = re.search(r'PY.*N','PYANBNCNDN')
对于这个匹配形式,有多个字符串满足这种匹配形式,re默认使用贪婪匹配,即输出匹配最长的子串,即输出PYANBNCNDN
怎么输出最短的子串?,增加一个?就可以对操作符进行扩展,实现最小匹配:
示例:match = re.search(r'PY.*?N','PYANBNCNDN')
三、关于Python爬虫正则表达式匹配为空的问题?
在用正则表达式匹配网址信息的时候,有时候会匹配到空的列表,有可能会是以下几种情况:
1)选取正则表达式的方式不对
不太建议在网页上按F12,然后选中自己想爬的内容,直接写正则表达式,因为网页的源代码和返回给我们请求的html是不一样的,源代码里会夹杂着一些隐含符,/n或者/r/n…要是没有这些隐含符就会导致匹配到空的字符串。
解决方法:在def_analysis(self,htmls):里设置断点,然后进行调试
2)爬取的内容是动态的
你爬取的内容是动态的,返回的html里没有相应的信息,例如京东的价格,评论等,这样就不能用正则表达式来匹配,需要从接口里爬取。
3)如果以上两种可能性都没有
可能是你爬取的网址反爬虫十分强大,不让你爬,可以试试更换ip地址。
总结:
文章总结了爬虫的用的频率较高的正则表达式中的一些基本使用方法,对于网络爬虫来说,重要的是要能从网页中提取信息。
Demand feedback