异常捕获和正则表达式

    技术2022-07-11  82

    异常捕获和正则表达式

    异常捕获

    1.什么是异常捕获

    让程序执行过程中出现异常的时候不崩溃可以继续运行

    注意:不是任何时候都需要使用异常捕获,是在你明明知道某个位置可能会出现异常,又不想让程序崩溃的时候才使用

    2.异常捕获的语法

    语法一:获取所有异常

    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 ...

    3. finally关键字

    在所有异常捕获的语法结构的后面都可以添加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…

    1.什么是正则表达式

    正则表达式是一种让字符串处理更简单的工具(本质是做字符串匹配)

    2.正则表达式的语法

    fullmatch(正则表达式,字符串) – 让正则表达式和字符串进行完全匹配,如果匹配失败结果是None

    js的正则表达式:/正则表达式/

    python的正则表达式:r‘正则表达式’

    1.普通字符 - 表示字符本身
    re_str = r'abc' result = fullmatch(re_str, 'abc') print(result)
    2) . - 匹配一个任意字符
    re_str = r'.abc' result = fullmatch(re_str, '+abc') print(result)
    3)\w - 匹配任意一个数字、字母或者下划线(针对ASCII码表有效)(注意:平时不用)
    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)
    # 5)\s - 匹配任意一个空白字符
    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)
    6) \D和\S

    \字母 – 小写字母和大写字母的功能相反

    re_str = r'\dabc\D' result = fullmatch(re_str, '8abc-') print(result) re_str = r'\Sabc' result = fullmatch(re_str, '=abc') print(result)
    7) [字符集] - 匹配字符集中出现的任意一个字符

    注意:一个[]只能匹配一个字符

    [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)
    8)[ ^字符集] - 取不在字符集中任意一个字符
    [^\u4e00-\u9fa5] - 匹配任意一个非中文字符 [^0-9] - 匹配任意一个非数字字符 [^a-zA-Z] - 匹配任意一个非字母字符

    2.检测符号

    1) \b – 检查是否是单词边界

    单词边界:字符串开头、字符串结尾,凡是能区分出两个不同单词的符号

    注意:检测类的符号不影响匹配长度,只是在匹配成功的时候做进一步检测

    re_str = r'\d\d.\b\d\d' print(fullmatch(re_str, '56=89'))
    2) ^ - 检测^所在的位置是否是字符开头
    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'))

    3.匹配次数

    1) * - 字符出现0次或多次(随便好多次都是对的)
    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'))
    2) + 匹配一次或多次(至少一次)
    re_str = r'a+' print(fullmatch(re_str, 'a'))
    3)? - 匹配0次或1次
    re_str = r'\d?abc' print(fullmatch(re_str, '0abc')) # 练习:写一个正则表达式可以匹配任意一个整数字符串 # '23874', '-234', '+2348977' re_str = r'[-+]?\d+' print(fullmatch(re_str, '+23874'))
    4) {}
    {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'))

    4. 贪婪和非贪婪

    在匹配模式不确定的情况下,匹配模式分为两种:贪婪和非贪婪

    贪婪:默认的都是贪婪(在能匹配到的前提下匹配次数尽可能多)

    *、+、?, {M,N}、{M,}、{,N}

    非贪婪:(在能匹配到的前提下匹配次数尽可能少)在匹配次数不确定的时候,次数后面加问号,匹配的就是非贪婪的

    ​ *?、+?、??、{M,N}?、{M,}?、{,N}?

    re_str = r'\d{2,}' print(search(re_str, '护士227382abc你好!')) # <re.Match object; span=(2, 8), match='227382'> re_str = r'\d{2,}?' print(search(re_str, '护士227382abc你好!')) # <re.Match object; span=(2, 4), match='22'>

    分支和分组

    1.分支: |

    正则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'))

    2.分组:()

    1)整体操作
    #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'))
    2) 重复:

    \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'))
    3)捕获 findall

    3.转义字符在具有特殊功能或者特殊意义的符号前面加\ ,让功能消失

    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'))
    Processed: 0.017, SQL: 9