学习日志2.22
-
异常捕获
程序出错后会立刻停止,不会再继续执行
异常捕获:当程序出现异常时,程序不会崩溃,继续执行后续代码
异常的产生并不取决于代码时,就可以使用异常捕获
语法1:捕获所有异常 try: 需要捕获异常的代码 except: 异常捕获后会执行的代码 语法2: try: 需要捕获异常的代码 except 异常类型: 异常捕获后会执行的代码 语法3: try: 需要捕获异常的代码 except (异常类型1,异常类型2……): 异常捕获后会执行的代码 语法4: try: 需要捕获异常的代码 except 异常类型31 异常捕获后会执行的代码 except 异常类型2: 异常捕获后会执行的代码 except 异常类型3: 异常捕获后会执行的代码 # try 在捕获到异常后,对比异常类型,后续代码不再执行 try: age = int(input('输入年龄')) except: print('输入格式错误') age = None print(age) try: with open('./asd.txt', 'r', encoding='utf-8') as f: pass except: with open('./asd.txt', 'w', encoding='utf-8') as f: pass with open('./asd.txt', 'r', encoding='utf-8') as f: f.read()
关键字 finally
finally的存在并不影响原来的异常捕获的执行
finally后面的代码无论try中的代码发生什么情况都会执行,就算异常没有被捕获,或者程序即将崩溃
-
正则匹配类符号
正则表达式是一种字符串处理工具
-
普通字符
普通字符指的是正则表达式中除了特殊符号以外的符号
re_str = 'abc' result = fullmatch(re_str, 'abc') print(result)
-
特殊字符
# 2. . 匹配一个任意字符 re_str = 'a.c' # 一个字符串有三个字符,第一个a,最后一个c,中间任意 result = fullmatch(re_str, 'avc') print(result) # 3. \d 匹配一个任意数字 re_str = r'a\d\db' # 一个字符串有四个字符,第一个为a,最后为b,中间是数字 result = fullmatch(re_str, 'a56b') print(result) # 4. \s 匹配一个任意空白字符 # 空白字符:空格、\n、\t re_str = r'\d\d\s\d\d' result = fullmatch(re_str, '12 34') print(result) # 5. \D 匹配任意一个非数字 # 6. \S 匹配一个任意非空白字符 # 7. [字符集] 匹配字符集中任意一个字符 """ [abc123] [abc\d] a、b、c或者任意一个数字 [2-8] -表示2到8 [a-z] [a-zA-Z] 匹配任意字母 [\u4e00-\u9fa5] 匹配任意中文 [abc-] 一个[]只能匹配一个字符 -表示范围,前面字符串的编码值必须小于后面字符的编码值 如果-不在两个字符之间则表示-本身 """ re_str = r'[\da-zA-z-]123' result = fullmatch(re_str, 'f123') print(result) # 8. [^字符集] 字符集的补集
-
-
正则检测类符号
匹配类符号(一个符号必须匹配一个对应的字符)
检测类符号:检测符号所在的位置是否符合要求,检测类符号不影响匹配
先匹配再进行检测,检测符号不影响匹配字符长度
# 1. \b 单词边界 # 单词边界:所有可以划分出两个不同单词的符号,包括空白、标点符号、字符串开头或者结尾 re_str = r'abc\b,123\b' result = fullmatch(re_str, 'abc,123') print(result) re_str = r'a\b.b' result = fullmatch(re_str, 'a,b') print(result) # 2. \B 非单词边界 re_str = r'a.\Bb' result = fullmatch(re_str, 'apb') print(result) # 3. ^ 字符串开头 re_str = r'^\d\d\d' result = fullmatch(re_str, '234') print(result) # 4. $ 字符串结尾
-
匹配次数
# 1. * 匹配0次或多次 # a* 匹配任意多个字符a # \d* 匹配任意多个\d(数字字符) re_str = r'1a*2' result = fullmatch(re_str, '1aaa2') print(result) re_str = r'a\d*b' result = fullmatch(re_str, 'a24324325b') print(result) re_str = r'1[abc]*2' result = fullmatch(re_str, '1ac2') print(result) # 2. + 匹配一次或多次 # 3. ? 匹配零次或一次 # re_str = r'[+-]?\d+' # 整数 # 4. {} """ {N} 匹配N次 {M,N} 匹配M到N次 {M,} 匹配至少M次 {,N} 匹配最多N次 """ re_str = r'a\d{3,45}b' result = fullmatch(re_str, 'a342b') print(result) # 5. 贪婪和非贪婪 # 在匹配次数不确定的时候匹配模式分贪婪和非贪婪 # 贪婪:在能匹配成功的前提下尽可能多匹配 # 非贪婪:在能匹配成功的前提下尽可能少匹配,在匹配次数不定的次数后加?,变为非贪婪 # re_str = r'a.+b' re_str2 = r'a.+?b' result = re.search(re_str, 'a bbb') # 默认贪婪 result2 = re.search(re_str2, 'a bbb') print(result, result2)
-
分支和分组
# 1.分组 # 用()将部分正则表示为一个整体进行操作 re_str = r'(\d{2}[a-z]{3}){3}' print(fullmatch(re_str, '23khh34fgr74dfg')) # 整体重复 # 在包含分组的正则中,可以通过\N来重复前面第N个分组匹配到的内容 re_str = r'a(\d{2})\1' print(fullmatch(re_str, 'a1212')) re_str = r'a(\d{2})\1{3}' print(fullmatch(re_str, 'a34343434')) # 捕获(只作用于findall) re_str1 = r'tel:(\d{5})' # 只获取括号内的内容 re_str = r'tel:(\d{5})' print(findall(re_str, 'tel:23768, name:xiaoming, age:18岁,id:27237486; tel:72891, name:张三, age:67岁, id:23479782')) # 2.分支 | # 分支符号前后视为一个整体 re_str2 = r'abc(\d{2}|[A-Z]{3})'
-
转义符号
# 转义符号:在特殊符号前加\使符号意义消失 re_str = r'abc\.' print(fullmatch(re_str, 'abc.')) re_str = r'\(\)' print(fullmatch(re_str, '()')) # 具有特殊意义和功能的独立的符号,放在[]内功能消失 re_str = r'abc[.]' print(fullmatch(re_str, 'abc.'))