模块之re模块
八、正则表达式
1.1首先我们先了解re模块与正则表达式的关系:
re模块与正则表达式之间的关系
正则表达式不是python独有的 它是一门独立的技术所有的编程语言都可以使用正则,但是如果你想在python中使用,你就必须依赖于re模块
作用:正则就是用来筛选字符串中的特定的内容的
语法:[]字符组 一个字符组里面表达的是或的关系而且只能取其一
网站手机号校验功能示例:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/
与re模块没有任何关系,仅仅是测试正则表达式:http://tool.chinaz.com/regex
1.2 元字符与量词的关系
# 元字符表:. 是匹配所有 ^以什么为开头 以什么为结尾$ ^jason$ 是百分百精准匹配 多一个少一个都不行
# a|b abc|ab 注意:或的模式匹配必须是长的放前面 ab可以先匹配 abc则匹配abc
# 贪婪匹配和非贪婪匹配:正则匹配的时候默认正则都是贪婪匹配模式(尽量匹配多的) 可以在贪婪匹配后面加一个量词(?匹配零个没有匹配零个或有则匹配则一个)
# 在使用元字符和量词的时候量词必须放在元字符后面,切只对紧挨的元字符有限制作用
九、re模块
# 阿姨 三个必须掌握的方法
1.1 findall()
# res = re.findall('表达式','待匹配的字符串')
# 1.res = re.findall('表达式','待匹配的字符串')
# res = re.findall('a','eva egon jason')
# print(res) # ['a', 'a'] 返回一个列表 将所有符合的结果存到列表里面
# res = re.findall('[a-z]*','eva egon jason') # * 零个或者多个
# print(res) # ['eva', '', 'egon', '', 'jason', '']
# res = re.findall('[a-z]+','eva egon jason')
# print(res) # ['eva', 'egon', 'jason'] + 一个或者多个
1.2 re.search()
# res1 = re.search('表达式','待匹配的字符串')
res1 = re.search('a','eva egon jason tank')
res2 = re.search('l','eva egon jason tank')
print(res1,type(res1)) # None type:<class '_sre.SRE_Match'>
<_sre.SRE_Match object; span=(2, 3), match='a'>
print(res1.group())
小结:search 将表达式和待匹配的字符串从左到右逐一查找直到第一个匹配上立马返回匹配信息 查找的返回的结果是一个对象,需要调用group()方法得到匹配的字符串
如果是None 调用group()则会报错。
解决方案:可以判断if res: 再执行打印结果
if res1:
print(res1.group())
1.3 re.match()
# res3 = re.match('表达式','待匹配的字符串')
# res3 = re.match('表达式','待匹配的字符串')
# res3 = re.match('a','eva egon jason tank')
# res4 = re.match('e','eva egon jason tank')
# print(res3.group()) # 'NoneType' object has no attribute 'gr
# if res4:
# print(res4.group())
# # 小结:
# 1.match查找规则是match只会匹配字符串的开头部分(单个开头或整体)
# 2.返回的是一个对象需要调用group()方法才能拿到匹配的字符串结果
小结:
search 和 match 的异同点:
search 和 match 的异同点:
1.相同点:
# 1.语法句式一样;
# 2.匹配返回的结果都是一个对象,需要调用group()才能得到匹配的字符串;
# 3.如果返回的是一个None,在调用group()会报错
2.不同点:
# 1.search:匹配查找从左到右只要第一个匹配上,不会继续往下找,直接返回结果
# 2.match: 只匹配开头,所以匹配必须是以表达式的单个字符换或一个整体字符串为开头否者返回None
9.2 re模块的其他方法:
# 1 re.split()
# re模块的其他方法:
# 1 re.split()
# res2 = re.split('[ab]','abcd')
# print(res2) # ['','','cd']
# 2 re.sub()
# res2 = re.sub('\d','HA','eav3egon4jason56')
# print(res2) # 第一个是表达式;第二个是要更新的内容;第三个是待匹配的字符串
# eavHAegonHAjasonHAHA
# 3 re.subn()
# res3 = re.subn('\d','HA','eav3egon4jason56',3)
# print(res3) # ('eavHAegonHAjasonHAHA', 4) 返回的是一个元祖和更新的个数,
# ('eavHAegonHAjasonHA6', 3)
# ('eavHAegonHAjasonHA6', 3)后面的参数是可以更改的是表示匹配到的数字这个数和更换数
# 4 re.compile()
# obj = re.compile('\d{3}')
# print(obj) # #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
# res4 = obj.findall('eee6a6a6aw7ww123q456q9p')
# print(res4 ) # 给定义规则按照obj对象去匹配3个数字为一组的字符串
# ['123', '456'] # findall 配配所有结果
# res5 = obj.search('ee666p999ewrewf3p218')
# print(res5.group()) # 只要匹配到,就不会往下匹配了
#
# res6 = obj.match('123dsf5')
# print(res6.group()) # 是否以3ge数字开头 不然直接报错
#
9.3 # ——————————————————扩展——————————————————
# res7 = re.search('(^[1-9])(\d{16})([0-9x])$','452402199312233318' )
# print(res7.group())
# print(res7.group(1))
# print(res7.group(2))
# print(res7.group(3))
# 补充有名分组
# 补充有名分组
# res8 = re.match('(^[1-9])(\d{14})(\d{2}[0-9x])?$','452402199311163243')
# print(res8.group())
# print(res8.group())
# print(res8.group())
# print(res8.group())
# 有名分组:(?P<username>)
ret4 = re.search(')
print(ret4.group('username'))
print(ret4.group('user_pwd'))
# 分组
# ret = re.search('www.(baidu|oldboy).com','www.oldboy.com')
# ret1 = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
# print(ret.group()) # www.oldboy.com 无视分组
# print(ret1) # ['oldboy']
# 正对findall()没有group()取值的方法,所以默认分组名优先获取的结果
# 取消分组在所属括号内(?:)
# 取消分组在所属括号内(?:)
# ret2 = ret1 = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
# print(ret2) # ['www.oldboy.com'] 取消分组 直接匹配结果
# 爬虫:(写作业)
import re
import json
from urllib.request import urlopen
"""
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=
<li>
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>1489907人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
</li>
"""
def getPage(url):
response = urlopen(url)
return response.read().decode('utf-8')
def parsePage(s):
com = re.compile(
'<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
'.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
ret = com.finditer(s)
for i in ret:
yield {
"id": i.group("id"),
"title": i.group("title"),
"rating_num": i.group("rating_num"),
"comment_num": i.group("comment_num"),
}
def main(num):
url = 'https://movie.douban.com/top250?start=%s&filter=' % num
response_html = getPage(url)
ret = parsePage(response_html)
print(ret)
f = open("move_info7", "a", encoding="utf8")
for obj in ret:
print(obj)
data = str(obj)
f.write(data + "\n")
count = 0
for i in range(10):
main(count)
count += 25
# - 编写验证身份证的正则\
# 身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部
模块之re模块的更多相关文章
- python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)
1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
- Python模块之常用模块,反射以及正则表达式
常用模块 1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...
- python基础知识8——模块1——自定义模块和第三方开源模块
模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...
- Python引用模块和查找模块路径
模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...
- threading模块和queue模块实现程序并发功能和消息队列
简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ...
- VBA标准模块与类模块
大家通过之前的介绍,已知道怎么将一个空模块插入VBA的工程中.从插入模块中可以看到,模块有有两种——标准模块与类模块.类模块是含有类定义的特殊模块,包括其属性和方法的定义.在后面会有介绍与说明. 随着 ...
- ansible定时任务模块和用户组模块使用
接上篇,还是一些基础模块的使用,这里主要介绍的是系统模块的使用. 下面例子都进行过相关的实践,从而可以直接进行使用相关的命令. 3.用户模块的使用 用户模块主要用来管理用户账号和用户的属性(对远程主机 ...
- ansible服务模块和组模块使用
本篇文章主要是介绍ansible服务模块和组模块的使用. 主要模块为ansible service module和ansible group moudle,下面的内容均是通过实践得到,可以直接运行相关 ...
- python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块
正则表达式 语法: mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...
- 第五十五节,IO多路复用select模块加socket模块,伪多线并发
IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...
随机推荐
- 文本跟随鼠标并且显示x轴和y轴位置
一.文本跟随鼠标并且显示x轴和y轴位置 代码如下: window.onload=function(){ var mydiv = document.createElement("div&quo ...
- 「JOISC 2016 Day 3」回转寿司
https://loj.ac/problem/2736 题解 挺有意思的题. 考虑这种操作不好直接维护,还有时限比较长,所以考虑分块. 考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元 ...
- 170815-关于Filter的知识点
Filter简介: Filter翻译为中文是过滤器的意思. Filter是JavaWeb的三大web组件之一:Servlet.Filter.Listener ...
- 百度地图 API 及使用
如果我们想使用地图的功能,我们就得使用别人的接口,百度地图无疑是个不错的选择 百度地图的网址:http://lbsyun.baidu.com/ 我们想使用里面的功能,就必须要获取密钥 如果时第一次使用 ...
- ajax传递json参数
var pros = []; for(var i = 1; i <= 2; i++) { var obj = {}; obj.id = i; obj.age = i*20; pros = pro ...
- 启动tomcat报错One or more listeners failed to start,却找不到任何错误日志的临时解决方案
在整合spring和quartz时,启动tomcat,服务台报以上错误,却找不到任何错误日志…… 参考了https://www.cnblogs.com/sxdcgaq8080/p/8005886.ht ...
- VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_GetMetadataKeys VixDiskLib_ReadMetadata 获取虚拟磁盘元数据 VixDiskLib_ ...
- 【EWM系列】SAP 关于EWM的WT增强简介
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 关于EWM的WT增强简介 ...
- js 获取屏幕宽高
网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...
- python+selenium的WebElement对象操作
webelement对象操作 webelement对象是selenium中所有元素的父类,也就是webelement对象拥有的方法,其它元素对象都会有: 只是不同的对象在调用特定方法时,效果是不一样的 ...