2019-03-22-day017-re模块

讲在课前

严格的执行每天的内容

学习的方法

  1. 记笔记 课上记框架
  2. 画思维导图 常用模块 30分钟
  3. 复习 翻笔记 2h
  4. 把课上的例子跟着都敲一遍
  5. 遇到不会的 自己研究5分钟
  6. 还不会 问问同学
  7. 再不会 问问学习好的
  8. 再不会 问老师
  9. 进阶
  10. 把所有的代码都加上注释
  11. 然后把代码删了
  12. 然后跟着注释把代码填上
  13. 写作业 3h
  14. 不会怎么办 就去问
  15. 有些思考题 不要去非得的得出一个答案来
  16. 降维思考
  17. 背默写 -- 睡前做 30min
  18. 写博客 周末 -- 提醒
  19. 把你学习python以来遇到的所有的报错都记录下来
  20. 各种兼职个人原因
  21. 睡眠时间 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())
  1. findall 找所有 返回列表
  2. search 找第一个 返回一个结果集,通过.group取值,如果没有匹配到,返回None,.group报错
  3. match 从头开始找第一个,返回一个结果集,通过.group取值,如果没有匹配到,返回None,.group报错
  4. 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)

参数说明

  1. 参数 正则表达式 待匹配的字符串
  2. 替换 正则 要换的结果 待匹配的字符串
  3. re.compile()
  4. 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())

程序员三大职责

  1. 时间
  2. 空间
  3. 用户体验
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('<>'))

分组在正则表达式中发挥的作用

  1. 分组在findall当中默认会优先被显示出来
  2. 如果不想优先,那么在分组中添加(?:正则规则)表示取消这个规则的优先显示+
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项目的时候 注册页 登录页
  • 从大段内容中数据的提取-爬虫

猜你喜欢

转载自www.cnblogs.com/meilong/p/20190322day017re-mo-kuai.html
今日推荐