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应用是没有主方法的,它是通过模块来声明应用应该如何启动的.同时,模块允许声明来描述应用中依赖关系,以及如何进 ...
随机推荐
- IDEA中部署tomcat,运行JSP文件,编译后的JSP文件存放地点总结
首先保证你正常部署了Tomcat,并且正常在浏览器中运行了JSP文件. 那么Tomcat编译后的JSP文件(_jsp.class 和 _jsp.java)的存放地点: (一)一般存放在你安装的Tomc ...
- Spring Boot项目打包部署到外部Tomcat
1.生成war包 1)修改POM文件,将打包类型改为war:<packaging>war</packaging> <packaging>war</packag ...
- Highcharts 配置选项详细说明
Highcharts 配置选项详细说明 Highcharts 提供大量的配置选项参数,您可以轻松定制符合用户要求的图表,本章节为大家详细介绍Highcharts 配置选项使用说明: 参数配置(属性+事 ...
- acl使用示例
declare v_count number; uprinciple varchar2(20); principle varchar2(20); begin uprinciple := ...
- 【LeetCode】数独
判断一个数独是否合法,未填的空格用字符 ' . ' 表示.该数独有解并不是必要的. e.g. 如图合法数独,输入 ["53..7....","6..195..." ...
- js 时间戳转特定格式的日期
var Tools = {}; Tools.formatDate = function (fmt,timestamp) { if(timestamp){ var date = new Date(par ...
- Redis的JAVA连接
ShardedJedis用法 package com.zhi.demo; import java.util.Arrays; import java.util.List; import redis.cl ...
- 003-RHEL7-Linux系统维护管理命令使用
系统维护管理命令: date 查看日期,设置日期 只有超级用户才能用date命令设置时间 date --help 显示时间的帮助命令 date{选项} 显示时间格式(以+开头,后面接时间格式) ...
- fzu1977
题解: 和前两题差不多 只不过变成了有些一定走,有些不一定 代码: #include<cstdio> #include<cmath> #include<algorithm ...
- bzoj2946
题解: 和poj1226差不多 把翻转去掉 然后不要忘记开大数组和二分的上限答案 代码: #include<bits/stdc++.h> using namespace std; type ...