Python 之正则表达re.compile()与re.findall()详解
在使用爬虫提取网页中的部分信息时,采用到了re.compile()与re.findall()两种方法,目的:把网页中的“某某城市土地规划表”截取并打印出来.
网页中的代码:
<span class='tab-details'>某某城市土地规划表</span>
提取的方法:
def parse_response(html):pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S)items = re.findall(pattern,html) print(items)return items
结果:
['某某城市土地规划表']
这里主要讲解pattern,re.compile()与re.findall()的定义及用法:
1.pattern :pattern 属性规定用于验证输入字段的正则表达式。
2.re.compile():compile() 方法用于在脚本执行过程中编译正则表达式,也可用于改变和重新编译正则表达式。
举例:在字符串中全局搜索 "man",并用 "person" 替换。然后通过 compile() 方法,改变正则表达式,用 "person" 替换 "man" 或 "woman",:
<script type="text/javascript">
var str="Every man in the world! Every woman on earth!";patt=/man/g;
str2=str.replace(patt,"person");
//用person取代man
document.write(str2+"<br />");patt=/(wo)?man/g;
patt.compile(patt);
str2=str.replace(patt,"person");
//用person取代man或者woman
document.write(str2);</script>
输出:(可见第一行中的man都被person取代,出现了woperson,第二行的的man和woman也被person取代,只有person,没有其他奇奇怪怪的字符串)
Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!
3.re.findall():额,这个最难搞,主要是为了讲解(.*?)
re.findall()函数是返回某种形式(比如String)中所有与pattern匹配的全部字符串,返回形式为数组。
下面是findall()函数的两种表示形式:(上面的代码采取的便是第二种形式):
import re
kk = re.compile(r'\d+')
kk.findall('one1two2three3four4')
#[1,2,3,4]#注意此处findall()的用法,可传两个参数;
kk = re.compile(r'\d+')
re.findall(kk,"one123")
#[1,2,3]
下面的是常用的正则表达式:
import restr = 'aabbabaabbaa'# 一个"."就是匹配除 \n (换行符)以外的任意一个字符
print(re.findall(r'a.b',str))#['aab', 'aab']# *前面的字符出现0次或以上
print(re.findall(r'a*b',str))#['aab', 'b', 'ab', 'aab', 'b']# 贪婪,匹配从.*前面为开始到后面为结束的所有内容
print(re.findall(r'a.*b',str))#['aabbabaabb']# 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']# 非贪婪,与上面一样,只是与上面的相比多了一个括号,只保留括号的内容
print(re.findall(r'a(.*?)b',str))#['a', '', 'a']str = '''aabbabaabbaabb''' #后面多加了2个b# 没有把最后一个换行的aab算进来
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']# re.S不会对\n进行中断
print(re.findall(r'a.*?b',str,re.S))#['aab', 'ab', 'aab', 'aa\n b']
注意'.*?'是对它的前后部分作为开始结束部分进行截取,而'(.*?)'也是把其前后作为开始结束,但是只截取括号部分,不包含开始结束部分!!!(同时在对前后部分的选择时要注意特征明确点,就是与众不同的的嘛,防止截取出的是其他部分啊)
re.findall中参数re.S的意义:
1.字符串变为(后面多加了2个b)
str = '''aabbabaabbaabb'''
2.参数无re.S,没有把最后一个换行的aab算进来
print(re.findall(r'a.*?b',str))
#['aab', 'ab', 'aab']
3.参数有re.S,不会对\n进行中断
print(re.findall(r'a.*?b',str,re.S))
#['aab', 'ab', 'aab', 'aa\n b']
在我们一开始的代码中就有re.s,因为在爬取网页的内容时是按照一个一个块的来爬取,可以理解为并列部分,会存在/n分行符。
def parse_response(html):pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S)items = re.findall(pattern,html) print(items)return items
参考:
1.HTML input pattern 属性 | 菜鸟教程 (runoob.com)
2.(10条消息) Pattern用法(正则表达式)_woniu317的博客-CSDN博客_pattern
3.JavaScript compile() 方法 (w3school.com.cn)
4.Python 正则表达re模块之findall()详解 - 知乎 (zhihu.com)
Python 之正则表达re.compile()与re.findall()详解相关推荐
- Python函数(函数定义、函数调用)用法详解
函数 函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码. 函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接 ...
- python代码案例详解-我用Python抓取了7000 多本电子书案例详解
安装 安装很简单,只要执行: pip install requests-html 就可以了. 分析页面结构 通过浏览器审查元素可以发现这个电子书网站是用 WordPress 搭建的,首页列表元素很简单 ...
- python 命令-python解析命令行参数的三种方法详解
这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...
- python中requests库的用途-python中requests库session对象的妙用详解
在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也 ...
- python处理excel大数据-Python实现大数据收集至excel的思路详解
一.在工程目录中新建一个excel文件 二.使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询 三.以下code内容为:实现从接口获取到的数据值写入 ...
- python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解
前言 本文主要给大家介绍了关于python获取当前文件夹下所有文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 os 模块下有两个函数: os.walk() os.li ...
- pythondifflib详解_用python标准库difflib比较两份文件的异同详解
[需求背景] 有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好.这时候使用python ...
- python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析
#2018-04-06 13:52:30 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘课程]二十一.朴素贝叶斯分类器详解及中文文本舆 ...
- python数据挖掘笔记】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取
#2018-04-06 07:57:00 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘笔记]二十.KNN最近邻分类算法分析详解及平衡 ...
最新文章
- qtablewidget限制输入类型_对敏感型电子信号输入实施过压保护的可靠新方法
- 热电偶单片机代码c语言,基于STC12C5A60S2单片机的恒温箱设计-LCD1602-热电偶(电路图+程序源码)...
- SSH与EJB 比较
- 使用C语言在windows下一口气打开一批网页
- CIO,你想做一辈子“消防员”吗?
- MySQL(11)-----多表创建及描述表关系(多对多的分析和实现)
- apache maven安装教程
- 微信公众号运营技巧总结
- 发卡机构(POS收单行)代码表
- 时空图卷积网络:一种用于交通预测的深度学习框架
- 流行前端几大UI框架排行榜
- CCF CSP 201903-1 小中大
- 01 基本句型 + 补语
- 计算长方体、四棱锥的表面积和体积(Java)
- Arduino C语言 240*240 TFT 显示屏绘制表盘手把手教学,粗暴易懂
- 用python画好看的图片,几张好看的HTML图片和利用Python画的好看的图
- 使用谷歌Colab(Colaboratory)免费GPU训练自己的模型及谷歌网盘无限容量(Google drive)申请教程
- 超低功耗MCU 的网站
- 腾讯招聘总监:腾讯内推的思考与实践|好文推荐
- webrtc janus服务器部署在公网,coturn转发媒体流