让程序执行过程中出现异常的时候不崩溃可以继续运行
注意:不是任何时候都需要使用异常捕获,是在你明明知道某个位置可能会出现异常,又不想让程序崩溃的时候才使用
语法一:获取所有异常
try :
代码段1
except:
代码段2
说明:
try、except – 关键字,固定写法
: – 固定写法
代码段1 – 和try保持一个缩进的一条或多条语句;可能会出现异常的代码(需要捕获异常的代码)
代码段2 – 出现的异常被捕获到了,需要执行的代码
执行过程:
先执行代码段1,如果执行过程中出现异常直接执行代码段2;如果代码段1中没有异常代码段2不会执行
# 练习:输入年龄,如果输入有误提示年龄输入有误的信息
try:
age = int(input('请输入年龄:'))
print('输入完成!')
except:
print('输入年龄有误!'))
语法二:针对指定类型的异常进行捕获
try:
代码段1
except 异常类型:
代码段2
执行过程:先执行代码段1,如果代码段1出现异常,判断出现的异常的类型和except后面的异常类型是否一致,如果一致程序不崩溃直接执行代码段2,不一致程序直接崩溃。
# [10, 20][100] # IndexError
# {'name': '张三'}['age'] # KeyError
try:
print({'name': '张三'}['age'])
print([10, 20][100])
except KeyError:
print('发生异常!')
语法三:同时捕获多种异常,针对不同的异常做相同的处理
try:
代码段1
except (异常类型1, 异常类型2,...):
代码段2
语法四:同时捕获多种异常,针对不同的异常做不同的处理
try:
代码段1
except 异常类型1:
代码段11
except 异常类型2:
代码段22
except 异常类型3:
代码段33
...
在所有异常捕获的语法结构的后面都可以添加finally关键字:
try:
代码段1
except:
代码段2
finally:
代码段3
代码段3无论什么情况都会执行(代码段1无论发生什么情况)
try:
print([10, 20, 30][100])
print('=======')
except KeyError:
print('捕获到异常')
finally:
print('写遗书!')
print('其他语句')
def func1():
try:
print('==========')
return 100
except:
print('捕获到异常')
finally:
print('写遗书2!')
print(func1())
re模块:python提供的专门使用正则表达式的相关的函数的模块
import…
正则表达式是一种让字符串处理更简单的工具(本质是做字符串匹配)
fullmatch(正则表达式,字符串) – 让正则表达式和字符串进行完全匹配,如果匹配失败结果是None
js的正则表达式:/正则表达式/
python的正则表达式:r‘正则表达式’
re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)
re_str = r'.abc'
result = fullmatch(re_str, '+abc')
print(result)
re_str = r'\wabc'
result = fullmatch(re_str, '8abc')
print(result)
####### 4)\d - 匹配任意一个数字字符
re_str = r'\d\d\d'
result = fullmatch(re_str, '142')
print(result)
re_str = r'\d\dabc\d\d'
result = fullmatch(re_str, '23abc89')
print(result)
re_str = r'\s\d..'
result = fullmatch(re_str, '\n9k/')
print(result)
re_str = r'\d\d\s\d\d'
result = fullmatch(re_str, '78 23')
print(result)
\字母 – 小写字母和大写字母的功能相反
re_str = r'\dabc\D'
result = fullmatch(re_str, '8abc-')
print(result)
re_str = r'\Sabc'
result = fullmatch(re_str, '=abc')
print(result)
注意:一个[]只能匹配一个字符
[abc123] - 匹配 a、b、c、1、2、3 中任意一个字符
[a-z] - 匹配从字符a到字符z之间的任意一个字符(匹配任意一个小写字母)
[A-Z] - 匹配任意一个大写字母
[a-zA-Z] - 匹配任意一个字母
[0-9] - 匹配任意一个数字字符
[\u4e00-\u9fa5] - 匹配任意一个中文字符
re_str = r'[cz+?]123'
result = fullmatch(re_str, '?123')
print(result)
re_str = r'[\u4e00-\u9fa5]123'
result = fullmatch(re_str, '看123')
print(result)
# 练习:判断输入手机号码是否合法
re_str = r'1[3-9]\d\d\d\d\d\d\d\d\d'
re_str = r'1[3-9]\d{9}'
result = ful1lmatch(re_str, '13598902763')
print(result)
[]中前面的字符编码必须小于后面的字符编码
# []中-如果不在两个字符之间,-就没有特殊功能直接表达它本身
result = fullmatch(r'[-09]abc', '-abc')
print(result)
# 练习:写一个正则表达式,要求可以匹配一个字符串:abc前面是一个数字、字母或者下划线
re_str = r'[a-zA-Z\d_]abc'
result = fullmatch(re_str, '_abc')
print(result)
[^\u4e00-\u9fa5] - 匹配任意一个非中文字符
[^0-9] - 匹配任意一个非数字字符
[^a-zA-Z] - 匹配任意一个非字母字符
单词边界:字符串开头、字符串结尾,凡是能区分出两个不同单词的符号
注意:检测类的符号不影响匹配长度,只是在匹配成功的时候做进一步检测
re_str = r'\d\d.\b\d\d'
print(fullmatch(re_str, '56=89'))
re_str = r'\d^abc'
print(fullmatch(re_str, '1abc')) # None
re_str = r'^\d\d\d'
print(fullmatch(re_str, '678'))
re_str = r'^\d\d\d'
print(fullmatch(re_str, '678'))
print(search(re_str, 'shdj39极客时间238u丄282=')) # None
# 3)$ - 检测$所在的位置是否是字符串结尾
re_str = r'\d\d$'
print(search(re_str, '时代峰峻78暗示法23沙发89'))
re_str = r'a*'
print(fullmatch(re_str, 'aaa'))
re_str = r'\d*'
print(fullmatch(re_str, '478923'))
re_str = r'123[a-z]*'
print(fullmatch(re_str, '123ukl'))
re_str = r'a+'
print(fullmatch(re_str, 'a'))
re_str = r'\d?abc'
print(fullmatch(re_str, '0abc'))
# 练习:写一个正则表达式可以匹配任意一个整数字符串
# '23874', '-234', '+2348977'
re_str = r'[-+]?\d+'
print(fullmatch(re_str, '+23874'))
{N} - 匹配N次
{M,N} - 匹配M到N次
{M,} - 匹配至少M次
{,N} - 匹配最多N次(0~N次)
re_str = r'\d{4}abc'
print(fullmatch(re_str, '6723abc'))
re_str = r'a{2,5}123'
print(fullmatch(re_str, 'aaaaa123'))
re_str = r'a{2,}123'
print(fullmatch(re_str, 'aaaaaaaaaaa123'))
re_str = r'a{,2}123'
print(fullmatch(re_str, 'aa123'))
在匹配模式不确定的情况下,匹配模式分为两种:贪婪和非贪婪
贪婪:默认的都是贪婪(在能匹配到的前提下匹配次数尽可能多)
*、+、?, {M,N}、{M,}、{,N}
非贪婪:(在能匹配到的前提下匹配次数尽可能少)在匹配次数不确定的时候,次数后面加问号,匹配的就是非贪婪的
*?、+?、??、{M,N}?、{M,}?、{,N}?
re_str = r'\d{2,}'
print(search(re_str, '护士227382abc你好!'))
#
re_str = r'\d{2,}?'
print(search(re_str, '护士227382abc你好!'))
#
正则1|正则2|正则3…
写一个正则匹配一个字符串:123abc 和456abc
re_str = r'123abc|456abc'
print(fullmatch(re_str, '456abc'))
re_str = r'123|345abc'
print(fullmatch(re_str, '123abc')) # None
print(fullmatch(re_str, '123'))
print(fullmatch(re_str, '345abc'))
#abc出现3次
re_str = r'(abc){3}'
print(fullmatch(re_str, 'abcabcabc'))
# 写一个正则匹配一个字符串:123abc 和 456abc
re_str = r'(123|456)abc'
print(fullmatch(re_str, '456abc'))
# 两个数字两个字母的结构重复4次: 34hj56kl67uj23Bm
re_str = r'(\d\d[a-zA-Z]{2}){4}'
print(fullmatch(re_str, '34hj56kl67uj23Bm'))
\M --重复前面第M个分组匹配到的内容(M从1开始)
re_str = r'(\d\d)=\1abc'
print(fullmatch(re_str, '67=67abc'))
re_str = r'(\d\d)-([a-z]{3})-\2-\1'
print(fullmatch(re_str, '23-bnm-bnm-23'))
略
re_str = r'\.\d\d'
print(fullmatch(re_str, '.23'))
re_str = r'abc\+\d\d'
print(fullmatch(re_str, 'abc+34'))
注意:独立存在特殊功能的符号在[]中功能会自动消失
re_str = r'[-+.]abc'
print(fullmatch(re_str, '.abc'))