第28篇 笔记-re模块方法 match split sub finditer compile 爬虫 异常处理 断言

内容提纲:
re模块的剩下方法
match split sub finditer compile
爬虫的例子
异常处理
异常处理的语法
主动抛出异常
自定义异常
断言
1 match方法的使用
import  re
    ret = re.match('\d+','294asd78ad')
    if ret:
        print(ret.group())

  

 
  '294'
 

  

 
    import  re
    ret = re.match('\d+','ab294asd78ad')
    print(ret)

  

 
   None
 

  



match方法必须是重头开始匹配,如果没有匹配成功,后面有可以匹配成功的也匹配不出来
match方法 相当于search方法的正则表达式前面加了^限定开始位置
import  re
    ret = re.search('^\d+','ab294asd78ad')
    print(ret)#None
 

  

 


import  re
    ret = re.search('^\d+','94asd78ad')
    print(ret.group())#'94'
 

  

2 split方法

字符串的切割:
s = 'alex|egon|boss_jin'
    ret = s.split('|')
    print(ret)
 

  

 
['alex', 'egon', 'boss_jin']
 

  



根据数字切割:
import re
    s = 'alex12egon56boss_jin'
    ret = re.split('\d+',s)
    print(ret)
 

  

 
['alex', 'egon', 'boss_jin']
 

  



显示分组的内容
import re
    s = 'alex12egon56boss_jin'
    ret = re.split('(\d+)',s)#匹配到的数字显示
    print(ret)
 

  

 
 ['alex', '12', 'egon', '56', 'boss_jin']
 

  



import re
s = 'alex12egon56boss_jin'
    ret = re.split('\d(\d)',s)#显示第二个数字
    print(ret)
 

  

 
['alex', '2', 'egon', '6', 'boss_jin']
 

  




 import re
    s = 'alex122egon586boss_jin'
    ret = re.split('(\d)+',s)#相当于# \d\d\d\d()\d
    print(ret)
 

  



s = 'alex||egon|boss_jin'#相当于'alex|''|egon|boss_jin'
    ret = s.split('|')
    print(ret)
 

  

 
 ['alex', '', 'egon', 'boss_jin']
 

  



3 sub方法的应用

字符串的替换
s = 'alex||egon|boss_jin'#相当于'alex|''|egon|boss_jin'
    ret = s.replace('|','-')
    print(ret)
 

  

 
alex--egon-boss_jin
 

  



sub替换
import re
    s = 'alex122egon586boss_jin'
    ret = re.sub('(\d)+','|',s)
    print(ret)
 

  



 alex|egon|boss_jin
 

  

 
    import re
    s = 'alex122egon586boss_jin'
    ret = re.sub('(\d)+','|',s,1)#只替换一次
    print(ret)

  

 
alex|egon586boss_jin
 

  



4 finditer是一种节省空间的方法

import re
    s = 'alex122egon586boss_jin'
    ret = re.finditer('(\d)+',s)
    print(ret)
 

  

 
   <callable_iterator object at 0x00000013E3028F98>#得到的是一个迭代器
 

  



import re
    s = 'alex122egon586boss_jin'
    ret = re.finditer('(\d)+',s)
    for i in ret:
        print(i.group())
 

  

 
122
    586
 

  



5 compile编译正则规则 一次编译之后 后面可以重复用使用
i
mport re
    s = 'alex122egon586boss_jin'
    com = re.compile('\d+')#编译正则规则
    ret = com.search(s)#使用编译好的正则规则啦查找s
    print(ret.group())
 

  



 import re
    s = 'alex122egon586boss_jin'
    com = re.compile('\d+')
    ret = com.search(s)
    print(ret.group())#122
    ret2 = com.findall(s)
    print(ret2)#['122', '586']
    ret3 = com.finditer(s)
    for i in ret3:
        print(i.group())
 

  

 
122
586
 

  



总结一下:使用compile 与 re.finditer()结合使用 提高效率又能节省空间

6 讲一个简单的爬虫例子
6.1初识前端
<h1>字符1</h1>
<a>字符2</a> #h1,a都是标签 前后必须一样
那就需要给标签命名
<?p<tag>.*?>.*?</(?p=tag)> #<?p<tag>.*?>第一个标签命名成tag
第二个标签</(?p=tag)>使用第一个标签的名字

6.2
    import re
        pattern ='<(?P<tag>.*?)>.*?</(?P=tag)>'#注意P是大写的,还要注意分组
        ret = re.search(pattern,'<h1>字符</h1>')
        print(ret)
 

  

 
  <_sre.SRE_Match object; span=(0, 11), match='<h1>字符</h1>'>
 

  


6.3
import re
    pattern ='<(?P<tag>.*?)>.*?</(?P=tag)>'
    ret = re.search(pattern,'<h1>字符</h1>')
    print(ret)
    print(ret.group())#<h1>字符</h1>
    print(ret.group(1))#h1      ret.group(0)是匹配的结果 ret.group(1)是分组中的内容
    print(ret.group('tag'))#h1
 

  



6.4
    import re
    pattern ='<(?P<tag>.*?)>.*?</\\1>'#\1代替前面的分组名字  \1会被转译
    ret = re.search(pattern,'<h1>字符</h1>')
    print(ret)
    print(ret.group())#<h1>字符</h1>
    print(ret.group(1))#h1
    print(ret.group('tag'))#h1
 

  



总结
(?:表达式) 取消优先显示
(?P<分组名字>表达式) (?P=组名) 给分组起名字

re.I(IGNORCASE)忽略大小写 括号里面是完整的写法
re.M(MULTILINE)多行模式,忽略换行
re.S(DOTALL)点可以匹配任意字符,包括换行符

7 异常处理
  l = ['登录','注册']
    try:
        num = int(input('>>>'))-1
        print(l[num])
    except ValueError:
        print('输入了错误的内容')
    except IndexError:
        print('输入的内容不在范围内')
 

  




#报错的类型合并
   l = ['登录','注册']
    try:
        num = int(input('>>>'))-1
        print(l[num])
    except (IndexError,ValueError):
        print('输入内容有误')
 

  



使用Exception
  l = ['登录','注册']
    try:
        num = int(input('>>>'))-1
        print(l[num])
    except Exception as e:#Exception报错的所有类型都包含
        print(e)#打印错误的类型
        print('输入内容有误')
 

  



>>>5
    list index out of range
    输入内容有误
 

  



一般的语法:
try:
可能发生异常的代码
except (错误类型1,错误类型2...):
处理代码
except Exception as e:
print(e)

try else的使用

try:
发送邮件
except ValueError:
print(发送失败)
else:
#代码顺利的执行,发短信通知,或者文件记录

finally的使用 即使程序报错也要执行

def func():
        try:
            f = open('content')
            name
        finally:
            f.close()
            print('文件已关闭')
    func()
 

  



Traceback (most recent call last):
    文件已关闭
      File "C:/骑士计划1期/day29/day29 笔记代码.py", line 60, in <module>
        func()
      File "C:/骑士计划1期/day29/day29 笔记代码.py", line 56, in func
        name
    NameError: name 'name' is not defined
 

  



为什么要使用finally
无论如何都要完成的事项
一般都是指收尾性的工作
关闭文件,占用了网络资源,打开了数据库的链接

几种常见的报错语法:
try/except
try/ecxept/else
try/finaly
try/except/finally
try/except/else/finally

8 自定义异常

class My_Exception(BaseException):
        def __init__(self,msg):
            super().__init__()
            self.msg = msg
        def __str__(self):
            return self.msg
    raise My_Exception('我的异常')
 

  

 
Traceback (most recent call last):
      File "C:/骑士计划1期/day29/day29 笔记代码.py", line 67, in <module>
        raise My_Exception('我的异常')
    __main__.My_Exception: 我的异常
 

  



9 断言
assert 1 == 1
    print('*'*10)
 

  

 
 **********
 

  



assert 1 == 2   #断言不成立则报出异常
    print('*'*10)
 

  

 
Traceback (most recent call last):
      File "C:/骑士计划1期/day29/day29 笔记代码.py", line 75, in <module>
        assert 1 == 2
    AssertionError
 

  

猜你喜欢

转载自www.cnblogs.com/cavalier-chen/p/9630791.html