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应用是没有主方法的,它是通过模块来声明应用应该如何启动的.同时,模块允许声明来描述应用中依赖关系,以及如何进 ...
随机推荐
- 统计数组中各个元素出现的次数,元素取值范围为:1到N
问题描述: * 给定一个整数数组a,长度为N,元素取值范围为[1,N]. * 统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1). * 可以改变原来数组结构. 思路: * 从第 ...
- spring boot 创建web项目并使用jsp作前台页面
参考链接:https://www.cnblogs.com/sxdcgaq8080/p/7712874.html
- python-django缓存
三 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的 ...
- js时间与时间戳互相转换
var _time1 = Date.parse(new Date(‘2017-05-02 00:00:00’))/1000; //将设定的日期转换为时间戳 _time1 = getLocalTime( ...
- Hive的JDBC
Hive 的JDBC 包含例子 https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-JDBC HiveServ ...
- hibernate建表默认为UTF-8编码
一.问题: hibernate自动建表的编码应该是数据默认的编码格式,一般也不是utf-8.所以想要建表默认的编码是UTF-8,应该怎么做呢? 二.解决方法: 拿mysql举例: (一).修改hibe ...
- MySql(六)单表查询
十.单表查询 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制 ...
- ZZW原创_imdpd导入时产生的错误
1.ORA-39083: Object type OBJECT_GRANT failed to create with error Processing object type SCHEMA_EXPO ...
- Vue keep-alive总结
<keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM. <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是 ...
- PHP指针相关函数
1.each each — 返回数组中当前的键/值对并将数组指针向前移动一步 $arr = array("one", "two", "three&qu ...