模块之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 ...
随机推荐
- Leetcode 13. Roman to Integer(水)
13. Roman to Integer Easy Roman numerals are represented by seven different symbols: I, V, X, L, C, ...
- 20181022-JSP 开发环境搭建
JSP 开发环境搭建 JSP开发环境是您用来开发.测试和运行JSP程序的地方. 本节将会带您搭建JSP开发环境,具体包括以下几个步骤. 配置Java开发工具(JDK) 这一步涉及Java SDK的下载 ...
- J - Mr.Panda and TubeMaster
题解 我们可以把每个格子拆成两个点,一个表示横向的,一个表示纵向的,相邻的格子横向和纵向连边. 如果直接按照题意做的话,我们应当在横向和纵向的点之间连边,有限制的边设下界为1,然后跑可行流. 或者考虑 ...
- [ethereum源码分析](2) ethereum基础知识
前言 上一章我们介绍了如何搭建ethereum的debug环境.为了更深入的了解ethereum,我们需要了解一些ethereum的相关的知识,本章我们将介绍这些知识. ethereum相关知识 在学 ...
- hashcode native
hashcode Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值. 在设计hashCode方法和equal ...
- ES6 模板语法和分隔符
let user = 'Barret'; console.log(`Hi ${user}!`); // Hi Barret!
- 使用IDEA 创建Maven项目,外加SSM框架
使用idea 新创建项目 然后 新创建 java .resources 文件夹...... 图上是项目结构 java文件夹下的 文件夹 命名规范 com.nf147(组织名)+ oukele(作者) ...
- CDQ求子矩阵的和
Description维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=20000 ...
- Day02 结构类型
1.结构类型是值类型 (类是引用类型) 2.结构中也可以像类一样,定义 字段 属性 方法 但是不能给字段赋初始值 3.结构的构造方法中,必须为所有的字段赋值 4.不能为结构显示定义无参数的构造 ...
- Memcache和Redis复习总结
Memcache Memcache是一个高性能的分布式的内存对象缓存系统,主要是用来缓存从MySQL数据库中查询的数据,减少对mysql数据库的压力. Memcache的工作流程: 当用户发生一个动态 ...