异常捕获、正则基础、re模块

一、异常捕获

1.什么是异常捕获
“”"
让程序执行过程中出现异常的时候不崩溃可以继续运行。

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

语法一:获取所有异常
try:
    代码段1
except:
    代码段2

说明:
try、except - 关键字,固定写法
: - 固定写法
代码段1 - 和try保持一个缩进的一条或者多条语句; 可能会出现异常的代码(需要捕获异常的代码)
代码段2 - 出现的异常被捕获到了,需要执行的代码

执行过程:
先执行代码段1,如果执行执行过程中出现异常直接执行代码段2;如果代码段1中没有异常代码段2不会执行
“”"

#练习:输入年龄,如果输入有误提示年龄输入有误的信息
try:
     age = int(input('请输入年龄:'))
     print('输入完成!')
 except:
     print('年龄输入有误!')

 print('===================')

try:
    # age = int(input('请输入年龄:'))
    print({'name': '张三'}['age'])
    print([1, 2, 3][10])
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提供的专门使用正则表达式的相关的函数的模块

from re import fullmatch, search, findall
from fileManager import read_file

1.什么正则表达式
“”"
正则表达式是一种让字符串处理更简单的工具(本质是做字符串匹配)
“”"
2.正则表达式的语法
“”"
fullmatch(正则表达式, 字符串) - 让正则表达式式和字符串进行完全匹配,如果匹配失败结果是None
js的正则: /正则表达式/
python的正则: r’正则表达式’
“”"

print('=====================1.匹配符号=====================')
1)普通字符  -  表示字符本身
re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)

2).   -   匹配一个任意字符
re_str = r'.abc'
result = fullmatch(re_str, '+abc')
print(result)

匹配一个长度是5的字符串,字符串中间三个字符是abc,第一个字符和最后一个字符任意
re_str = r'.abc.'
result = fullmatch(re_str, '(abc+')
print(result)

匹配一个长度是3的任意字符串
re_str = r'...'
result = fullmatch(re_str, 'ajs')
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) [字符集]  - 匹配字符集中出现的任意一个字符
"""
注意:一个[]只能匹配一个字符
a.
[abc123]  -  匹配 a、b、c、1、2、3 中任意一个字符
b.
[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'
result = fullmatch(re_str, '13598902763')
print(result)

[]-前面的字符编码值必须小于-后面的字符编码
result = fullmatch(r'[a-0]abc', '0abc')

[]-如果不在两个字符之间,-就没有特殊功能直接表达它本身
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]  - 匹配任意一个非字母字符
"""
print(fullmatch(r'[abc^]123', 'b123'))
print(fullmatch(r'[^abc]123', 'a123'))
print('=====================2.检测符号======================')
1)\b  - 检测是否是单词的边界
"""
单词边界:字符串开头、字符串结尾、凡是能区分出两个不同单词的符号
注意:检测类的符号不影响匹配的长度,只是在匹配成功的时候做进一步的检测
"""
message = 'how are you?i am fine!thank you!'
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'))

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='))

3)$  - 检测$所在的位置是否是字符串结尾
re_str = r'\d\d$'
print(search(re_str, '时代峰峻78暗示法23沙发89'))
print('======================3.匹配次数==================')
1*  - 匹配0次或多次
"""
字符*    -  字符出现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)+   -  匹配1次或多次(至少1)
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)贪婪和非贪婪
“”"
在匹配次数不确定的情况下,匹配模式分为两种:贪婪和非贪婪
a.贪婪:默认都是贪婪的(在能匹配到的前提下匹配次数尽可能多)
*、+、?, {M,N}、{M,}、{,N}

b.非贪婪:(在能匹配到的前提下匹配次数尽可能少)在匹配次数不确定的时候,次数后面加问号,匹配就是非贪婪的
*?、+?、??、{M,N}?、{M,}?、{,N}?
“”"

re_str = r'\d{2,}'
print(search(re_str, '护士227382abc你好!'))

re_str = r'\d{2,}?'
print(search(re_str, '护士227382abc你好!'))

#练习:获取疫情信息中所有的国家的名字
content = read_file('data.json')
re_str = r'"provinceName":"(.+?)",'
print(findall(re_str, content))

三、正则的分支和分组

from re import fullmatch

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

四、正则和re模块

from re import compile, fullmatch, match, search, findall, finditer, split, sub
from re import IGNORECASE, MULTILINE, DOTALL, S

1、 re.compile()

“”"
compile(正则表达式) - 编译正则表达式,创建正则表达式对象
“”"

re_obj = compile(r'\d{3}')

fullmatch(r'\d{3}', '234')
re_obj.fullmatch('234')

search(r'\d{3}', 'hu23hjk890jhkh78')
re_obj.search('hu23hjk890jhkh78')

2.匹配

"""
1)fullmatch(正则表达式, 字符串) - 让整个字符串和正则表达式进行匹配
2)match(正则表达式, 字符串) - 匹配字符串开头
如果匹配不到结果是None,如果匹配成功了结果是匹配对象
"""
re_str = r'\d{3}'
print(fullmatch(re_str, '732'))
print(fullmatch(re_str, '732hjas'))   # None
print(match(re_str, '789'))
print(match(re_str, '789j手机打开'))

设置同时忽略大小写和单行匹配
print(fullmatch(r'123.[a-z]{3}', '123\nHNA', flags=S|IGNORECASE))
print(fullmatch(r'(?is)123.[a-z]{3}', '123\nHNA'))

3.匹配对象

print('=============================')
result = match(re_str, '789j手机打开')
re_str = r'(\d{2})-([a-z]{3})'
result = match(re_str, '23-sjm回款及时发货')
print(result)
1)获取匹配到的字符串
匹配对象.group()   -  获取整个正则表达式匹配到结果
print(result.group())    # 23-sjm

匹配对象.group(分组号)  - 获取正则表达式中指定的分组匹配到的结果(分组号从1开始)
print(result.group(1))   # 23
print(result.group(2))   # sjm

2)获取匹配到的子串的范围
匹配对象.span()
print(result.span())     # (0, 6)
print(result.span(2))    # (3, 6)

3)获取原字符串
匹配对象.string
print(result.string)

4.查找
“”"
1)search(正则表达式,字符串) - 在字符串中查找第一个能和正则表达式匹配的子串。如果找到了返回匹配对象,找不到返回None
2) findall(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串。返回一个列表,列表中的元素是字符串
3) finditer(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串。返回一个迭代器,迭代器中的元素是匹配对象
“”"

str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
result = search(r'\d+', str1)
print(result)    # <re.Match object; span=(3, 6), match='123'>

result = findall(r'\d+', str1)
print(result)    # ['123', '123', '456', '98', '7', '123']

result = findall(r'\d+[a-z]', str1)
print(result)   # ['123a', '456k', '7h', '123o']

findall正则中如果有分组,只获取分组匹配到的内容
result = findall(r'(\d+)[a-z]', str1)
print(result)     # ['123', '456', '7', '123']

result = findall(r'(\d+)([a-z])', str1)
print(result)   # [('123', 'a'), ('456', 'k'), ('7', 'h'), ('123', 'o')]

str2 = '9h3jabc===9k2mabc9293h0oabc==!!!'
result = findall(r'(\d[a-zA-Z]){2}abc', str2)
print(result)


result = finditer(r'((\d[a-zA-Z]){2})abc', str2)
print(list(result))
for x in result:
    print(x.group(1))

5.切割

split(正则表达式, 字符串)  - 将字符串中能和正则表达式匹配的子串作为切割点,对字符串进行切割。返回值是列表,列表中的元素是字符串
split(正则表达式, 字符串, 次数)  - 指定切割次数
str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
result = split(r'\d+', str1)
print(result)    # ['and', '=hu', 'aaa', 'klk', '!ll', 'hu', 'oop']

result = split(r'\d+', str1, 3)
print(result)     # ['and', '=hu', 'aaa', 'klk98!ll7hu123oop']

6.替换

sub(正则表达式, 字符串1, 字符串2)  -  将字符串2中能和正则表达式匹配的子串全部替换成字符串1
sub(正则表达式, 字符串1, 字符串2, 次数)   -  限制替换次数
str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
new_str1 = sub(r'\d+', '+', str1)
print(new_str1)

sentence = '你丫是傻 叉吗? 我操你大爷的. F u c k you.'
re_str = r'(?i)[操肏艹草曹]|f\s*u\s*c\s*k|s\s*h\s*i\s*t|傻\s*[比屄逼叉缺吊屌]|煞\s*笔'
new_sentence = sub(re_str, '*', sentence)
print(new_sentence)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值