内容提纲:
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