2019-03-22-day017-re模块
讲在课前
严格的执行每天的内容
学习的方法
- 记笔记 课上记框架
- 画思维导图 常用模块 30分钟
- 复习 翻笔记 2h
- 把课上的例子跟着都敲一遍
- 遇到不会的 自己研究5分钟
- 还不会 问问同学
- 再不会 问问学习好的
- 再不会 问老师
- 进阶
- 把所有的代码都加上注释
- 然后把代码删了
- 然后跟着注释把代码填上
- 写作业 3h
- 不会怎么办 就去问
- 有些思考题 不要去非得的得出一个答案来
- 降维思考
- 背默写 -- 睡前做 30min
- 写博客 周末 -- 提醒
- 把你学习python以来遇到的所有的报错都记录下来
- 各种兼职个人原因
- 睡眠时间 7个小时
re模块
根据正则规则从一段内容中查找结果
re.findall()
import re
#根据正则规则从一段内容中查找结果
ret= re.findall('\d+','alex123yuan234')
print(ret)
re.search() 只取第一个
ret = re.search('\d+','alex123yuan234')
print(ret) # 结果对象
print(ret.group())
ret = re.search('\d+','alexyuan')
if ret:
print(ret.group())
ret = re.match('\d+','123alex')
print(ret.group())
- findall 找所有 返回列表
- search 找第一个 返回一个结果集,通过.group取值,如果没有匹配到,返回None,.group报错
- match 从头开始找第一个,返回一个结果集,通过.group取值,如果没有匹配到,返回None,.group报错
- match可以被替代么? 可以
re.search('^\d+','alexyuan') == re.match('\d+','123alex')
#--'alex84'
pattern, repl, string
ret = re.sub('\d+','sb','alex84wusir73') # 默认替换所有
ret = re.sub('\d+','sb','alex84wusir73',1) # 写了1表示替换一次
print(ret)
re.subn()
re.subn()
ret = re.subn('\d+','sb','alex84wusir73')
print(ret) # ('alexsbwusirsb', 2)
re.split()
re.split()
ret = re.split('\d+','alex84wusir73yuan')
print(ret)
ret = 'alex|age|'.split('|')
print(ret)
参数说明
- 参数 正则表达式 待匹配的字符串
- 替换 正则 要换的结果 待匹配的字符串
- re.compile()
- re.finditer()
要求把字符串中所有的数字匹配出来
python代码 要编译 要解释 机器码
re.findall('\d+','askjy9374hbvr')
在findall中写了代码,这个代码是否包含去解析\d+
解析的内容编译解释 机器码
re.findall('[\w-.]+@([a-zA-Z\d-]+.)+[a-zA-Z\d]{2,6}','askjy9374hbvr')
对于一个经常被重复使用的正则表达式,我们可以先进行一次编译
之后只要用到这个表达式直接拿出来用就可以了
这样做节省了代码的执行 "时间"
par = re.compile('\d+')
print(par)
ret = par.findall('alex84')
print(ret)
ret = par.search('alex38')
print(ret.group())
finditer
ret = re.findall('\d','alex84alex84alex84alex84alex84alex84alex84alex84'*200)
print(ret)
ret = re.finditer('\d','alex84alex84alex84alex84alex84alex84alex84alex84'*200)
for i in ret:
print(i.group())
程序员三大职责
- 时间
- 空间
- 用户体验
par = re.compile('\d+')
ret = par.finditer('alex84alex84alex84alex84alex84alex84alex84alex84'*200)
for i in ret:
print(i.group())
匹配
# findall
# search match 返回结果集 .group取值
字符串其他处理
# 替换呀
# 切割呀
进阶
# 空间 finditer 返回一个迭代器,迭代器里装的都是结果集,需要通过group取值
# 时间 compile 能够提前编译一个正则表达式,当同一个正则需要被多次使用的时候,可以节省时间
正则表达式
<h1>hahaha<\h1>
<h2>wahaha<\h2>
<title>qqxing<\title>
模块的使用
正则表达式
<h1>hahaha<\h1>
<h2>ahaha<\h2>
<title>qqxing<\title>
import re
ret = re.findall('>\w+<',r'<title>qqxing<\title>')
print(ret[0].strip('<>'))
分组在正则表达式中发挥的作用
- 分组在findall当中默认会优先被显示出来
- 如果不想优先,那么在分组中添加(?:正则规则)表示取消这个规则的优先显示+
import re
ret = re.findall('>(\w+)<',r'<title>qqxing<\title>')
print(ret) # findall永远优先显示分组中的内容
import re
ret = re.findall('www\.(?:baidu|oldboy)\.com',r'www.baidu.com')
print(ret)
ret = re.findall('\d+(?:\.\d+)?',r'1.23+2.34')
print(ret)
split和分组,会保留被切掉的在分组中内容
import re
ret = re.split('\d(\d)','alex84wusir73')
print(ret)
search和分组
import re
ret = re.search(r'<(\w+)>(\w+)<\\(\w+)>',r'<title>qqxing<\title>')
print(ret.group(0)) # 不受到分组的影响
print(ret.group(1))
print(ret.group(2))
- 在爬虫\数据清洗的过程中最常用的正则表达式的操作
- 并不是把我要的内容的正则写出来
- 而是把整个页面都用正则描述下来,然后把我需要的内容放在分组里
- 这样就能够取到我想要的内容了
遇见分组
- findall 优先显示分组中的内容
- split 保留被切掉的分组内的内容
- search 可以通过组的索引取值
- 取消分组的特殊行为(?:正则)
分组命名
import re
ret = re.search(r'<(?P<tab1>\w+)>(?P<content>\w+)<\\(\w+)>',r'<title>qqxing<\title>')
print(ret.group(0)) # 不受到分组的影响
print(ret.group('tab1')) # 不受到分组的影响
print(ret.group('content')) # 不受到分组的影响
特殊的需求
#前端语言 html
#<h1>wahaha</h2></h1>
par = '<\w+>.*?</\w+>'
import re
ret = re.search('<(?P<tag>\w+)>.*</(?P=tag)>','<h1>wahaha</h2></h1></h3>')
print(ret.group())
par = '<\w+>.*?</\w+>'
import re
ret = re.search(r'<(\w+)>.*</\1>','<h1>wahaha</h2></h1></h3>')
print(ret.group())
import re
#当我们要匹配的内容混在不想匹配的内容中
#只能把不想要的也匹配出来,然后去掉不想要的就是想要的
ret = re.findall('\d+\.\d+|(\d+)','1-2*(60+(-40.35/5)-(-4*3))')
ret.remove('')
print(ret)
总结
re模块
- findall search match
- sub subn split
- compile finditer
- 分组和所有的方法之间的特殊现象
- findall
- split
- search
取消分组优先(?:)
- 正则表达式中的分组命名
- (?P<组名>)
- 引用分组(?P=组名)
常见的使用正则解决问题的方式
- 把整个结构描述下来,对想要的进行分组
- 把不想要的也匹配出来,然后用手段删掉
应用
- 用户输入信息的验证-web项目的时候 注册页 登录页
- 从大段内容中数据的提取-爬虫
2019-03-22-day017-re模块的更多相关文章
- [2019.03.22] Linux 学习心得(1)
本文关键词:shell 判断.grep正则表达式使用和贪婪匹配理解 1. if [ $a -le $b ], 一开始自学的时候我以为 [ ... ] 就是普通的,语法规定的结构,结果其实人家是&quo ...
- 2019.03.22 读书笔记 Linq中的IEnumerable与IQueryable
Linq主要分为 Linq to object .Linq to XML .Linq to sql(现在都用EF了). 针对object和sql,微软分别设计了两套接口IEnumerable.IQue ...
- 2019.03.22 读书笔记 var object dynamic
var:语法糖,在编译时推断出类型,根据反编译可以看出.实际用处是增加代码的健壮性,比如 linq ,匿名对象等. object:很多人容易和var混淆,其实概念上完全不同,没什么可比性. dynam ...
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- 2019.03.03 - Linux搭建go语言交叉环境
编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...
- Beta冲刺(1/7)——2019.5.22
所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(1/7)--2019.5.22 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...
- GCN代码分析 2019.03.12 22:34:54字数 560阅读 5714 本文主要对GCN源码进行分析。
GCN代码分析 1 代码结构 . ├── data // 图数据 ├── inits // 初始化的一些公用函数 ├── layers // GCN层的定义 ├── metrics // 评测指标 ...
- Yii 框架学习--03 多应用多模块
本文以YII 2.0.7为例. 概述 首先看看多应用和多模块的特点: 多应用的特点: 独立配置文件 独立域名 多模块的特点: 统一配置文件 统一域名 那么,实际该怎么决定使用多应用还是多模块呢? 对于 ...
- Python-爬虫03:urllib.request模块的使用
目录 1. urllib.request的基本使用 1.1 urlopen 1.2. 用urlopen来获取网络源代码 1.3. urllib.request.Request的使用 2. User-A ...
- 03、AngularJs的模块与控制器
大部分的应用程序都有一个主方法(main)来组织,实例化,启动应用程序.而AngularJs应用是没有主方法的,它是通过模块来声明应用应该如何启动的.同时,模块允许声明来描述应用中依赖关系,以及如何进 ...
随机推荐
- 『MXNet』第七弹_多GPU并行程序设计
资料原文 一.概述思路 假设一台机器上有个GPU.给定需要训练的模型,每个GPU将分别独立维护一份完整的模型参数. 在模型训练的任意一次迭代中,给定一个小批量,我们将该批量中的样本划分成份并分给每个G ...
- sql百万级查询优化(转)
< 数据库技术内幕 > 处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进 ...
- LINQ 初步了解
.NET Framework 3.5的新特性 Language Integrated Query,即语言集成查询 查询 和语言结合关系数据库里的信息使用的XML文档保存在本地的DataSet内存中的L ...
- Leetcode 1002. 查找常用字符
1002. 查找常用字符 显示英文描述 我的提交返回竞赛 用户通过次数301 用户尝试次数324 通过次数303 提交次数480 题目难度Easy 给定仅有小写字母组成的字符串数组 A,返回列表 ...
- PostgreSQL主备流复制机制
原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...
- win10 将本地项目上传到github (第一次+再次上传)
推荐网址: https://blog.csdn.net/zamamiro/article/details/70172900 https://blog.csdn.net/qq_15800305/arti ...
- charles抓包工具使用方法
注意: 1.软件安装证书,移动端安装证书: 2.设置SSL proxying setting: 3.设置Map Remote: 这里主要是为了设置移动端代理服务器,让其重定向到想要连接的环境上,比如手 ...
- jQuery封装 写的的确不错 转载
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间.这篇文章将概述jQuery插件开发的基本知识,最佳做法和常见的陷阱. 入门 编写一个jQuery插件开始于给jQuery.fn加入 ...
- react router @4 和 vue路由 详解(二)react-router @4用法
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 2.react-router @4用法 a.大概目录 不需要像vue那样麻烦的 ...
- 逆袭之旅DAY28.XIA.异常处理
2018-07-24 14:42:24 第一种: 第二种: 第三种: 执行 try--catch--finally--return(执行return 退出方法) 代码示例: 输入数字,输出对应课 ...