讲在课前
严格的执行每天的内容
学习的方法
- 记笔记 课上记框架
- 画思维导图 常用模块 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项目的时候 注册页 登录页
- 从大段内容中数据的提取-爬虫