模块之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 ...
随机推荐
- #452 Div2 Problem C Dividing the numbers ( 思维 || 构造 )
题意 : 将从 1 ~ n 的数分成两组,要求两组和的差值尽可能小,并输出其中一组的具体选数情况 分析 : 如果将这 n 个数从大到小四个一组来进行选择的话那么差值就为 0 ,然后再来考虑 n%4 ! ...
- TCP学习笔记
TCP/IP 协议分层模型 TCP/IP 协议族按层次分别分为以下 4 层:应用层.传输层.网络层和数据链路层.层次化之后,每个层级只需要考虑自己的任务就可以了,不再需要弄清其他层级的功能了. TCP ...
- android 启动默认的邮件客户端,多附件的问题
目前开发的app中需要发送邮件,所以需要调用android默认的邮件客户端,并需要添加多个邮件附件,我该通过哪个组件调用默认的客户端?用什么组件来支持多个附件的电子邮件? 是通过下面的哪一个?(Int ...
- [BZOJ3199][SDOI2013]escape:半平面交
分析 好像叫V图什么的. 容易发现,对于每个点,其监视的范围就是这个点与其它所有点的垂直平分线分割平面后的半平面交.由于数据范围很小,所以我们可以直接枚举每个点,使用双端队列求出其监视的范围.若两个点 ...
- [CSP-S模拟测试]:超级树(DP)
题目传送门(内部题5) 输入格式 一行两个整数$k$.$mod$,意义见上. 输出格式 一行一个整数,代表答案. 样例 样例输入1: 2 100 样例输出1: 样例输入2: 3 1000 样例输出2: ...
- 【转】阿里架构总监一次讲透中台架构,13页PPT精华详解
转:https://blog.csdn.net/u011323949/article/details/99542576 本文整理了阿里几位技术专家,如架构总监 谢纯良,中间件技术专家 玄难等几位大牛, ...
- fpython-笔记(五)装饰器、匿名函数
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_8_字节输入流_InputStream类&FileInputStream
inputStream
- CDN分发
CDN 是Content Delivery Network,即内容分发网络. 未完待续..
- 操作Redis--hash/key-value
redis也是一个数据库,它的存储以key-value的方式存放,比如: a.关系型数据库 比如: mysql.oracle.sql server.db2.sqlite数据库,为关系型数据库 数据通过 ...