关键词:
Python爬虫之正则表达式
0.介绍
爬虫的分类:网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种
- 通用爬虫:通用网络爬虫 是 捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
- 聚焦爬虫:聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
1.操作符
-
\\S
:与\\s
相反 -
\\w
: -
- 对于 str 类型,匹配任何 单词字符,包括 [a-zA-Z0-9_] 以及其它单词字符
- 对于 str 类型开启 re.ASCII 标志或者 bytes 类型,只匹配 [a-zA-Z0-9_]
-
\\W
:与\\w
相反 -
[ ]
:匹配 括号内所包含的任意一个字符 -
- 若连字符 (-) 出现在字符串中间则表示范围,出现在首位则作普通字符;
- 若脱字符 (^) 出现在字符串首位则表示排除,出现在中间则作普通字符
-
\\s
: -
- 对于 str 类型,匹配任何 空白字符,包括 [\\t\\n\\r\\f\\v] 以及其它空白字符
- 对于 str 类型开启 re.ASCII 标志或者 bytes 类型,只匹配 [\\t\\n\\r\\f\\v]
-
.
:匹配除换行符之外的 所有字符 -
^
:匹配字符串的 开始位置 -
$
:匹配字符串的 结束位置 -
*
:匹配字符串 零次或多次,在后面加上 ? 表示启用非贪婪模式匹配(默认为贪婪模式) -
+
:匹配字符串 一次或多次,在后面加上 ? 表示启用非贪婪模式匹配(默认为贪婪模式) -
?
:匹配字符串 零次或一次,在后面加上 ? 表示启用非贪婪模式匹配(默认为贪婪模式) -
-
M, N
表示匹配字符串 M~N 次M,
表示匹配字符串至少 M 次,N
表示匹配字符串至多 N 次N
表示匹配字符串 N 次
经典例子:
IP地址:
2…常用方法
1re.search()
返回match对象
re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
2.re.match()
当匹配的第一个字符不符合,则返回空,返回match对象
*注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
- group() 返回被 RE 匹配的字符串
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
- group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
a. group()返回re整体匹配的字符串,
b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组
import re
a = "123abc456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) #123abc456,返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) #123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) #abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) #456
###group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。###
import re
line = "This is my blog"
#匹配含有is的字符串
matchObj = re.match( r'(.*) is (.*?) .*', line, re.M|re.I)
#使用了组输出:当group不带参数是将整个匹配成功的输出
#当带参数为1时匹配的是最外层左边包括的第一个括号,一次类推;
if matchObj:
print ("matchObj.group() : ", matchObj.group())#匹配整个
print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一个括号
print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二个括号
else:
print ("No match!!")
#输出:
matchObj.group() : This is my blog
matchObj.group(1) : This
matchObj.group(2) : my
3.re.findall()
4.re.split()
按照能够匹配的子串将string分割后返回列表。
可以使用re.split来分割字符串,如:re.split(r’\\s+’, text);将字符串按空格分割成一个单词列表。
格式:
re.split(pattern, string[, maxsplit])
maxsplit用于指定最大分割次数,不指定将全部分割。
print(re.split('\\d+','one1two2three3four4five5'))
执行结果如下:
['one', 'two', 'three', 'four', 'five', '']
print(re.split('a','1A1a2A3',re.I))
输出结果并未能区分大小写
这是因为re.split(pattern,string,maxsplit,flags)默认是四个参数,当我们传入的三个参数的时候,系统会默认re.I是第三个参数,所以就没起作用。如果想让这里的re.I起作用,写成flags=re.I即可。
5.re.finditer()
返回match对象
6.e.sub()
import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
print(re.sub(r'\\s+', '-', text))
执行结果如下:
JGood-is-a-handsome-boy,-he-is-cool,-clever,-and-so-on...
其中第二个函数是替换后的字符串;本例中为'-'
第四个参数指替换个数。默认为0,表示每个匹配项都替换。
7.re.compile()
编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
格式:
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:
标志 | 含义 |
---|---|
re.S(DOTALL) | 使.匹配包括换行在内的所有字符 |
re.I(IGNORECASE) | 使匹配对大小写不敏感 |
re.L(LOCALE) | 做本地化识别(locale-aware)匹配,法语等 |
re.M(MULTILINE) | 多行匹配,影响^和$ |
re.X(VERBOSE) | 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 |
re.U | 根据Unicode字符集解析字符,这个标志影响\\w,\\W,\\b,\\B |
8.subn()
返回替换次数
格式:
subn(pattern, repl, string, count=0, flags=0)
print(re.subn('[1-2]','A','123456abcdef'))
print(re.sub("g.t","have",'I get A, I got B ,I gut C'))
print(re.subn("g.t","have",'I get A, I got B ,I gut C'))
执行结果如下:
('AA3456abcdef', 2)
I have A, I have B ,I have C
('I have A, I have B ,I have C', 3)
8,两种使用re对象的方法的方式:使用面向对象方式时,将正则表达式写入compile()方法中,re对象的方法中就不用正则表达式参数了;
一些区别
1、re.match与re.search与re.findall的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
a = re.search(r'[\\d]', "abc33").group()
print(a)
p = re.match(r'[\\d]', "abc33")
print(p)
b = re.findall(r'[\\d]', "abc33")
print(b)
执行结果:
3
None
['3', '3']
4.Match对象
1,match对象的属性:
2,match方法:
5.正则表达式的匹配
1.贪婪匹配
2.最小匹配
贪婪匹配实例
import re
rE=re.compile(r"[A-Z].*[A-Z]")
ls=rE.search("adaAdssdDsdsFdsdsdM")
print(ls.group(0))
最小匹配实例
import re
rE=re.compile(r"[A-Z].*?[A-Z]")
ls=rE.search("adaAdssdDsdsFdsdsdM")
print(ls.group(0))
6.参考文章
https://www.cnblogs.com/lq13035130506/p/12250588.html
https://www.cnblogs.com/tina-python/p/5508402.html
https://zhuanlan.zhihu.com/p/78502318
在线RE测试:https://tool.oschina.net/regex
python爬虫之正则表达式(代码片段)
Python爬虫之正则表达式0.介绍爬虫的分类:网络爬虫可分为通用爬虫和聚焦爬虫两种通用爬虫:通用网络爬虫是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地&... 查看详情
python之爬虫beautifulsoup库的使用(代码片段)
...库,处理高效,支持多种解析器。利用它就不用编写正则表达式也能方便的实现网页信息的抓取快速使用通过下面的一个例子,对bs4有个简单的 查看详情
python爬虫入门(代码片段)
python爬虫入门(5)正则表达式在线正则表达式测试网站文章目录python爬虫入门(5)一.正则表达式1.简介2.语法常用操作符语法实例经典正则表达式匹配IP地址的正则表达式二.使用re模块1.findall2.search3.match4.==finditer==5.正则... 查看详情
python爬虫之beautifulsoup库,基本使用以及提取页面信息(代码片段)
一、BeautifulSoup简介爬虫正则表达式参考:Python爬虫正则表达式和re库在爬虫过程中,可以利用正则表达式去提取信息,但是有些人觉得比较麻烦。因为花大量时间分析正则表达式。这时候可以用高效的网页解析库Beauti... 查看详情
爬虫之正则解析(代码片段)
一、什么是正则正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。二、爬虫上什么场景下用正则这个很难说,对于初学者... 查看详情
爬虫之正则解析(代码片段)
一、什么是正则正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。二、爬虫上什么场景下用正则这个很难说,对于初学者... 查看详情
python爬虫利器之解析库的使用(代码片段)
...实现一个最基本的爬虫,提取页面信息时会使用正则表达式。正则表达式虽然提取信息速度很快,但是万一正则表达式有地方写错了,可能导致匹配失败,而且复杂项目的正则表达式很烦琐,那么有没有另一... 查看详情
python爬虫学习记录基本库的使用——正则表达式(代码片段)
正则表达式测试工具:http://tool.oschina.net/regex1、常见语法https://www.runoob.com/regexp/regexp-syntax.html2、match()用match传入要匹配的字符串以及正则表达式,就可以及检测这个正则表达式是否匹配字符串。importrecontent=... 查看详情
python爬虫学习之正则表达式爬取个人博客(代码片段)
实例需求:运用python语言爬取http://www.eastmountyxz.com/个人博客的基本信息,包括网页标题,网页所有图片的url,网页文章的url、标题以及摘要。实例环境:python3.7 requests库(内置的python库,无需手动安装) &... 查看详情
爬虫之正则表达式的应用爬取
...re模块在Python中,我们可以使用内置的re模块来使用正则表达式。有一点需要特别注意的是,正则表达式使用对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个r前缀,示例:r‘chuanzhiboke . python‘re模块的一般使... 查看详情
爬虫基础(代码片段)
...直接转化为python类型非结构化数据:HTML处理方式:正则表达式、xpath数据提取之json1.为什么要复习json由于把json数据转化为python内建数据类型很简单,所以爬虫中,如果我们能够找到返回json数据的URL,就会尽量 查看详情
python爬虫之scrapy框架系列(10)——scrapy选择器selector(代码片段)
...被称为选择器。因为,它们“选择”由XPath,re正则和CSS表达式指定的HTML文档的某部分。Scarpy选择器的API非常小,且非常简单。有点像bs4。1.1构造selector选择器Scrapy选择器是通过scrapy.Selecto 查看详情
python爬虫编程思想(32):正则表达式的分组(代码片段)
如果一个模式字符串中有用一对圆括号括起来的部分,那么这部分就会作为一组,可以通过group方法的参数获取指定的组匹配的字符串,当然,如果模式字... 查看详情
python爬虫之三种网页抓取方法性能比较
...sp;下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的 BeautifulSoup 模块,最后是强大的 lxml 模块。1.正则表达式? 如果你对正则表达式还不熟悉,或是需要一些提示时,可以查阅RegularExp... 查看详情
〖python网络爬虫实战⑨〗-正则表达式基本原理(代码片段)
...在里面。我们怎么样才可以获取我们想要的数据呢。正则表达式就是其中一个有效的办法。本文,我们就来了解一下正则表达式的用法。⭐️正则表达式 大家好,大家都听过正则表达式 查看详情
系统进阶学习python,爬虫,网页设计,正则表达式(附源代码)(代码片段)
1.2.1变量、行、缩进与注释1.2.2数据类型-数字与字符串1.2.3列表与字典1.2.4运算符介绍与实践1.3.1if语句1.3.2for语句1.3.3while语句1.3.4tryexcept异常处理语句1.4.1函数的定义与调用1.4.2函数返回值、作用域1.4.3一些重要的基本函数介绍1.4.4P... 查看详情
python爬虫正则表达式re.finditer元字符贪婪匹配惰性匹配(代码片段)
测试代码1:main5.py#-*-coding:utf-8-*-importreif__name__=='__main__':#findall匹配字符串中所有的符合正则的内容lst=re.findall(r"\\d+","濮阳电话区号:0393,郑州电话区号:0371& 查看详情
学不会的python之正则表达式详解(re模块)(代码片段)
本篇博客介绍了正则表达式与在python中的应用(re模块),及一些在开发中常见的模式示例。参考书籍《python核心编程(第三版)》学不会的python之正则表达式正则表达式(模式)简介正则应用搜索与匹配注意特殊符号与字符择一匹... 查看详情