Python笔记_23_正则相关函数_类中的方法_装饰器_异常

博客介绍了Python中正则相关函数,如search、match、split等,以及正则表达式修饰符。还讲解了类中的普通方法、绑定方法和静态方法,装饰器@property可将方法变属性。此外,阐述了程序错误分类,包括语法和异常错误,介绍异常处理语法及主动抛异常的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则相关函数

import re
search 和 match

通过正则匹配出第一个对象返回,通过group取出对象中的值

strvar = "1d2 3&5"
obj = re.search("(\d).*?(\d)",strvar)
print(obj)
res = obj.group()
print(res)

# 拿到分组当中的值用groups
res = obj.groups()
print(res)
# 拿到分组里的元素个数 lastindex
res = obj.lastindex
print(res)

# search 和 match 用法一样,区别在与match在正则的前面加了一个^ [必须以..开头]
# search 只需要在正则的前面加上^ 就可以取代match
strvar = "uuyydfopopopop3434sdf234"
# obj = re.search("^d.*?\d",strvar) #c 等价于match
obj = re.search("d.*?\d",strvar)
res = obj.group()
print(res,"<search>")

# match
obj = re.match("d.*?\d",strvar)
print(obj)  # None  必须以d作为字符串的开头
# res = obj.group()
# print(res)
split 切割
strvar = "alex|wusir|secret,boy"
lst = strvar.replace(",","|").split("|")
print(lst)

strvar = "alex,wusir|secret%boy"
res = re.split(r"[,|%]",strvar)
print(res)
# 可以选择分割的次数
res = re.split(r"[,|%]",strvar,1)
print(res)

strvar = "alex234234wusir2secret909090boy"
res = re.split(r"\d+",strvar)
print(res)
sub 替换
strvar = "alex,wusir|secret%boy"
res = re.sub("[,|%]","-",strvar)
print(res)
# 后面可以选择替换的次数
res = re.sub("[,|%]","-",strvar,1)
print(res)
# subn 与 sub 用法一样,最大的区别在于返回值 ,返回一个元组,包含替换的次数
res = re.subn("[,|%]","-",strvar)
print(res)
finditer 匹配字符串中相应内容,返回迭代器
  • finditerfindall用法一样,区别在于返回的是迭代器
  • 迭代器里面是一个一个的对象,想获取对象的值用group()
strvar = "sdfsdff&*&*%^%234sdfsdfskdjfk3sdf23"
lst = re.findall("\d",strvar)
print(lst)

res = re.finditer("\d",strvar)
print(res)
from collections import Iterator
print(isinstance(res,Iterator))


it = re.finditer("\d",strvar)
# lst = list(it)
# print(lst)
obj = next(it)
res = obj.group()
print(res)

for i in it:
	res = i.group()
	print(res)
compile 指定一个统一的匹配规则

写一套正则,程序就需要重新编译一次,
同一个正则多处使用,反复编译会浪费时间
这样的话,就可以使用compile来定义一次,终身受益

rule = re.compile("\d+")
print(rule)

strvar = "sdfsdfs234kjkjk*(*9343dsf3"
obj = rule.search(strvar)
print(obj)
print(obj.group())

lst = rule.findall(strvar)
print(lst)
正则表达式的修饰符

re.I 使匹配对大小写不敏感
re.M 多行匹配,影响^$
re.S 使 .匹配包括换行在内的所有字符

  • re.I 使匹配对大小写不敏感
strvar = "<h1>sdfsfsdfsd</H1>"
# rule = re.compile("<h1>.*?</h1>")
# 推荐使用flags来指定修饰符,预防未知错误
rule = re.compile("<h1>.*?</h1>",flags = re.I)
obj = rule.search(strvar)
print(obj)
print(obj.group())
  • re.M 多行匹配,影响 ^ 和 $
"""
# 每一行都单独的去匹配,卡主开头和结尾,忽略换行. 每一行都拿出来单独匹配
"<h1>sdfsf</h1>"
"<h1>dd22</h1>"
"<h1>aabb</h1>"
"""
strvar = """<h1>sdfsf</h1>
<h1>dd22</h1>
<h1>aabb</h1>"""


rule = re.compile("^<h1>(.*?)</h1>$",flags= re.M)
lst = rule.findall(strvar)
print(lst)
  • re.S 使 . 匹配包括换行在内的所有字符
strvar = '''give
123mefive
'''
rule = re.compile("(.*?)mefive",flags = re.S)
obj = rule.search(strvar)
print(obj.group())

类中的方法

  • 普通方法: 没有参数,只能类调用
  • 绑定方法:
    • (1)绑定到对象(自动传递对象参数)
    • (2)绑定到类(自动传递类参数)
  • 静态方法: 无论是类还是对象,都能调用的方法
class Dog():
	def __init__(self,name):
		self.name = name
		
	# 普通方法
	def jiao():
		print("小狗看见人就旺旺")
		
	# 绑定到对象方法
	def tian(self):
		print("小狗喜欢舔")
	
	# 绑定到类方法
	@classmethod
	def la(cls):
		print(cls)
		print("小狗会吃屎")
		
	# 静态方法
	@staticmethod
	def jump():
		print("小狗喜欢跳起来接飞盘")

obj = Dog("迈克尔·蛋")

# (1) 普通方法
Dog.jiao()
# 对象无法调用

# (2) 绑定到对象方法
obj.tian()
# Dog.tian(134)  # 如果硬要使用类来调用,满足实参形参一一对应.

# (3) 绑定到类方法
Dog.la()
# 用对象调用绑定到类的方法是可以的,先找出该对象所归属的类是谁,然后在传递这个类
obj.la()

# (4) 静态方法
obj.jump()
Dog.jump()

装饰器 @property

可以把方法变成属性使用
作用 : 控制类内成员的获取 设置 删除

  • 获取 @property
  • 设置 @自定义名.setter
  • 删除 @自定义名.deleter

方法一

class MyClass():
	def __init__(self,name):
		self.name = name
		
	#获取
	@property
	def username(self):
		return self.name
		# pass
		
	#设置
	@username.setter
	def username(self,val):
		self.name = val
		# pass
		
	#删除
	@username.deleter
	def username(self):
		del self.name
		# pass

obj = MyClass("马巨强")
# 获取
print(obj.username)
# 设置
obj.username = "张国成"
print(obj.username)
# 删除 del 调用删除相关的方法
del obj.username
# print(obj.username)

方法二

class MyClass2():
	
	def __init__(self,name):
		self.name = name
		
	# 获取值的方法
	def get_username(self):
		return self.name
		
	# 设置值得方法
	def set_username(self,val):
		self.name = val
		
	# 删除值得方法
	def del_username(self):
		del self.name

	# 在类加载的时候,自动把这些方法当成参数进行传递,不是在调用时传递的.
	# property 接受三个参数,必须按照顺序传递:(1)获取值的方法(2)设置值得方法(3)删除值得方法
	username = property(get_username,set_username,del_username)
	address = property(get_username,set_username,del_username)


obj = MyClass2("姚乘政")
# 获取当前username
print(obj.username)
# 设置值
obj.username = "ccc"
# 获取值
print(obj.username)
# 删除值
del obj.username
# print(obj.username)

obj.address = "深圳市区"
print(obj.address)
del obj.address
# print(obj.address)

异常

程序错误分为两种 : 语法错误 和 异常错误

  • 语法错误:代码没有按照python规定语法去写,发明创造产生的错误
  • 异常错误:在代码语法正确的前提下,程序报错就是异常

try...except...基础语法 用于解决程序异常问题
aise可以主动抛异常,异常类可以自定义

异常分类

异常类说明
IndexError索引超出序列的范围
KeyError字典中查找一个不存在的关键字
NameError尝试访问一个不存在的变量
IndentationError缩进错误
AttributeError尝试访问未知的对象属性
StopIteration迭代器没有更多的值
AssertionError断言语句(assert)失败
EOFError用户输入文件末尾标志EOF(Ctrl+d)
FloatingPointError浮点计算错误
GeneratorExitgenerator.close()方法被调用的时候
ImportError导入模块失败的时候
KeyboardInterrupt用户输入中断键(Ctrl+c)
MemoryError内存溢出(可通过删除对象释放内存)
NotImplementedError尚未实现的方法
OSError操作系统产生的异常(例如打开一个不存在的文件)
OverflowError数值运算超出最大限制
ReferenceError弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError一般的运行时错误
SyntaxErrorPython的语法错误
TabErrorTab和空格混合使用
SystemErrorPython编译器系统错误
SystemExitPython编译器进程被关闭
TypeError不同类型间的无效操作
UnboundLocalError访问一个未初始化的本地变量(NameError的子类)
UnicodeErrorUnicode相关的错误(ValueError的子类)
UnicodeEncodeErrorUnicode编码时的错误(UnicodeError的子类)
UnicodeDecodeErrorUnicode解码时的错误(UnicodeError的子类)
UnicodeTranslateErrorUnicode转换时的错误(UnicodeError的子类)
ValueError传入无效的参数
ZeroDivisionError除数为零
#IndexError   索引超出序列的范围
listvar = [1,2,3,4,5]
res = listvar[999]


# KeyError      字典中查找一个不存在的关键字
dic = {"a":1,"b":2,"鼓上骚":"石阡","花和尚":"鲁智深","智多星":"吴用"}
print(dic["母夜叉"])


# NameError                 尝试访问一个不存在的变量
print(wangwen)

# IndentationError          缩进错误
if 5==5:
print(111)
    print(22)
	
	
# AttributeError            尝试访问未知的对象属性
class MyClass():
	a = 5
	b = 6
obj = MyClass()
obj.c

# StopIteration             迭代器没有更多的值
it = iter(range(3))
for i in it:
	print(i)
res = next(it)

# AssertionError			 断言语句(assert)失败
'''
# 猜一猜 3大于1么? 如果3大于1 成立 没有任何反应
# 如果猜错了,直接抛异常
# 一般用在程序测试中
'''
assert 3<1

"""
if 3<1:
	print("成立")

"""

异常处理

try: code1 code2 ... except: code1 code2
把有可能出现异常的代码放到try这个代码块当中,
如果出现了异常错误,直接走except这个代码块

  • 异常处理基本语法
try:
	lst = [1,2,3,4]
	print(lst[999])
except:
	# print("这个程序有错误~")
	pass
  • 多分支条件的异常处理

except + 异常错误类 特指这种异常错误发生时,走该分支

try:
	# lst = [4,5,6,67]
	# print(lst[999])
	
	# dic = {"a":1}
	# print(dic['b'])
	
	print(wangwen)
	
# 特指IndexError , 索引越界错误
except IndexError:
	print("走到这里,说明报的是索引下标越界错误.")
except KeyError:
	print("走到这里,说明报的是字典的键出现错误")
except:
	# 条件都不满足 , 就走except分支
	print("有程序错误")
  • 处理迭代器越界错误

借助异常处理类,接受生成器函数中的 return 返回值

def mygen():
	yield 1
	yield 2
	return "done"
# 实例化生成器函数 产生生成器对象 简称 生成器
gen1 = mygen()

	
try:
	res = next(gen1)
	res = next(gen1)
	res = next(gen1)
	print(res)
# as 就是用来起名字的. 给StopIteration的类[对象]起名字
except StopIteration as e:
	'''
	当我们打印对象的时候,触发__str__魔术方法
	在StopIteration这个类当中,自动接受异常return 的返回值
	通过打印对象触发__str__方法,进而把返回值打印出来.
	'''
	print(e)

主动抛出异常 raise

BaseException是所有异常处理类的父类(超类 基类) (子类的别名:衍生类,派生类)
Exception 是所有普通错误处理类的父类

raise + (异常处理类 或 异常处理的对象)

try:
	raise
except:
	pass


res = issubclass(Exception,BaseException)
print(res) # True
  • 完整写法
try:
	# 必须嵌入在try这个代码块里面使用;
	raise BaseException
except BaseException:
	print("这个程序抛出了异常")
	
# 简写写法
try:
	raise 
except:
	print("程序异常")
  • 自定义异常类
# return_errorinfo 必须要依靠抛异常的形式才能触发获取当前的行号或者文件名
def return_errorinfo(n):
	import sys
	f = sys.exc_info()[2].tb_frame.f_back
	if n==1:		
		return str(f.f_lineno)      #返回当前行数
	elif n == 2:	
		return f.f_code.co_filename #返回文件名	
		
def get_info(n):
	try:
		raise
	except:
		return return_errorinfo(n)


# 如果想要自定义异常类,必须继承所有异常类的父类BaseException 
class MyException(BaseException):
	def __init__(self,err_num,err_msg,err_line,err_filename):
		# 打印错误号
		self.err_num = err_num
		# 打印错误信息
		self.err_msg = err_msg
		# 打印错误的行号
		self.err_line = err_line
		# 打印错误文件
		self.err_filename = err_filename
		
human_sex = "中性"	
try:
	if human_sex == "中性":
		raise MyException(1001,"人类没有中性",get_info(1),get_info(2))
except MyException as e:
	# 打印错误号
	print(e.err_num)
	
	# 打印错误信息
	print(e.err_msg)
	
	# 打印错误的行号
	print(e.err_line)
	
	# 打印错误文件
	print(e.err_filename)
├ │ ├ │ │ ├01 python s14 day1 开课介绍.avi │ │ ├02 python s14 day1 开课介绍2.avi │ │ ├03 python s14 day1 开课介绍3.avi │ │ ├04 python s14 day1 开课介绍4.avi │ │ ├05 python s14 day1 python发展介绍.avi │ │ ├06 python s14 day1 第一个python程序.avi │ │ ├07 python s14 day1 变量.avi │ │ ├08 python s14 day1 字符编码与二进制.avi │ │ ├09 python s14 day1 字符编码的区别与介绍.avi │ │ ├10 python s14 day1 用户交互程序.avi │ │ ├11 python s14 day1 if else流程判断.avi │ │ ├12 python s14 day1 while 循环.avi │ │ ├13 python s14 day1 while 循环优化版本.avi │ │ ├14 python s14 day1 for 循环及作业要求.avi │ │ └day1.zip │ ├ │ │ ├01 python s14 day2 本节鸡汤.avi │ │ ├02 python s14 day2 模块初识.avi │ │ ├03 python s14 day2 模块初识2.avi │ │ ├04 python s14 day2 pyc是什么.avi │ │ ├05 python s14 day2 python数据型.avi │ │ ├06 python s14 day2 bytes数据型.avi │ │ ├07 python s14 day2 列表的使用.avi │ │ ├08 python s14 day2 列表的使用2.avi │ │ ├09 python s14 day2 元组与购物车程序练习.avi │ │ ├10 python s14 day2 购物车程序练习实例.avi │ │ ├11 python s14 day2 字符串常用操作.avi │ │ ├12 python s14 day2 字典的使用.avi │ │ ├13 python s14 day2 三级菜单实例.avi │ │ ├14 python s14 day2 本周作业-购物车优化.avi │ │ └s14day2_code.zip │ ├ │ │ ├day3-code.zip │ │ ├oldboy-10.avi │ │ ├oldboy-11.avi │ │ ├oldboy-12.avi │ │ ├oldboy-13.avi │ │ ├oldboy-14.avi │ │ ├oldboy-15.avi │ │ ├oldboy-16.avi │ │ ├oldboy-17.avi │ │ ├oldboy-18.avi │ │ ├oldboy-19.avi │ │ ├oldboy-20.avi │ │ ├oldboy-21.avi │ │ ├oldboy-22.avi │ │ ├oldboy-23.avi │ │ ├oldboy-24.avi │ │ ├oldboy-25.avi │ │ ├oldboy-26.avi │ │ ├oldboy-27.avi │ │ └oldboy-9.avi │ ├ │ │ ├day4.zip │ │ ├oldboy-1.avi │ │ ├oldboy-10.avi │ │ ├oldboy-11.avi │ │ ├oldboy-12.avi │ │ ├oldboy-13.avi │ │ ├oldboy-14.avi │ │ ├oldboy-15.avi │ │ ├oldboy-16.avi │ │ ├oldboy-17.avi │ │ ├oldboy-18.avi │ │ ├oldboy-2.avi │ │ ├oldboy-3.avi │ │ ├oldboy-4.avi │ │ ├oldboy-5.avi │ │ ├oldboy-6.avi │ │ ├oldboy-7.avi │ │ ├oldboy-8.avi │ │ └oldboy-9.avi │ ├ │ │ ├day5.zip │ │ ├oldboy-1.avi │ │ ├oldboy-10.avi │ │ ├oldboy-11.avi │ │ ├oldboy-12.avi │ │ ├oldboy-13.avi │ │ ├oldboy-14.avi │ │ ├oldboy-2.avi │ │ ├oldboy-3.avi │ │ ├oldboy-4.avi │ │ ├oldboy-5.avi │ │ ├oldboy-6.avi │ │ ├oldboy-7.avi │ │ ├oldboy-8.avi │ │ └oldboy-9.avi │ ├ │ │ ├01 本节小鸡汤(电影分享).avi │ │ ├02 面向对象介绍.avi │ │ ├03 面向对象特性介绍.avi │ │ ├04 实例演示opp编程好处.avi │ │ ├05 实例变量与变量.avi │ │ ├06 变量的作用及析构函数.avi │ │ ├07 的继承.avi │ │ ├08 的继承2.avi │ │ ├09 经典与新式的继承顺序.avi │ │ ├10 继承实例讲解.avi │ │ ├11 多态实例讲解.avi │ │ ├12 本节作业之选课系统开发.avi │ │ └day6.zip │ ├ │ │ ├day7.zip │ │ ├oldboy-1.avi │ │ ├oldboy-10.avi │ │ ├oldboy-11.avi │ │ ├oldboy-12.avi │ │ ├oldboy-13.avi │ │ ├oldboy-2.avi │ │ ├oldboy-3.avi │ │ ├oldboy-4.avi │ │ ├oldboy-5.avi │ │ ├oldboy-6.avi │ │ ├oldboy-7.avi │ │ ├oldboy-8.avi │ │ └oldboy-9.avi │ ├ │ │ ├day8.zip │ │ ├oldboy-01.avi │ │ ├oldboy-02.avi │ │ ├oldboy-03.avi │ │ ├oldboy-04.avi │ │ ├oldboy-05.avi │ │ ├oldboy-06.avi │ │ ├oldboy-07.avi │ │ ├oldboy-08.avi │ │ ├oldboy-09.avi │ │ ├oldboy-10.avi │ │ └oldboy-11.avi │ ├ │ │ ├day9.zip │ │ ├oldboy-1.avi │ │ ├oldboy-10.avi │ │ ├oldboy-11.avi │ │ ├oldboy-12.avi │ │ ├oldboy-13.avi │ │ ├oldboy-14.avi │ │ ├oldboy-15.avi │ │ ├oldboy-2.avi │ │ ├oldboy-3.avi │ │ ├oldboy-4.avi │ │ ├oldboy-5.avi │ │ ├oldboy-6.avi │ │ ├oldboy-7.avi │ │ ├oldboy-8.avi │ │ └oldboy-9.avi │ ├ │ │ ├day10.zip │ │ ├oldboy-1.avi │ │ ├oldboy-10.avi │ │ ├oldboy-11.avi │ │ ├oldboy-12.avi │ │ ├oldboy-13.avi │ │ ├oldboy-14.avi │ │ ├oldboy-15.avi │ │ ├oldboy-16.avi │ │ ├oldboy-17.avi │ │ ├oldboy-18.avi │ │ ├oldboy-2.avi │ │ ├oldboy-3.avi │ │ ├oldboy-4.avi │ │ ├oldboy-5.avi │ │ ├oldboy-6.avi │ │ ├oldboy-7.avi │ │ ├oldboy-8.avi │ │ └oldboy-9.avi │ ├ │ │ ├01 python s14 day 11 上节作业和读书分享_rec.mp4 │ │ ├02 python s14 day 11 jQuery选择器_rec.mp4 │ │ ├03 python s14 day 11 jQuery选择器eq和nth-child的区别_rec.mp4 │ │ ├04 python s14 day 11 jQuery表单选择器_rec.mp4 │ │ ├05 python s14 day 11 jQuery操作属性、css和返回顶部实例_rec.mp4 │ │ ├06 python s14 day 11 jQuery过滤器、事件和扩展方法_rec.mp4 │ │ ├07 python s14 day 11 jQuery模态对话框和ajax_rec.mp4 │ │ ├08 python s14 day 11 eclipse环境的配置_rec.mp4 │ │ ├09 python s14 day 11 MVC框架和python的WEB框架简介_rec.mp4 │ │ ├10 python s14 day 11 Eclipse django 使用_rec.mp4 │ │ ├11 python s14 day 11 创建Django project and app_rec.mp4 │ │ └12 python s14 day 11 Django用户注册和ajax请求_rec.mp4 │ ├ │ │ ├01 python s14 day 12上节作业_rec.mp4 │ │ ├02 python s14 day 12 Django路由系统_rec.mp4 │ │ ├03 python s14 day 12 Windows下Python-MySQL模块的安装_rec.mp4 │ │ ├04 python s14 day 12 模型字段型_rec.mp4 │ │ ├05 python s14 day 12 增删改查过滤排序_rec.mp4 │ │ ├06 python s14 day12 模版语言和跨站请求伪造1_rec.mp4 │ │ ├07 python s14 day 12 模版语言和跨站请求伪造2_rec.mp4 │ │ └08 python s14 day 12 模板extend和include_rec.mp4 │ ├ │ │ ├day13.zip │ │ ├oldboy-1.avi │ │ ├oldboy-10.avi │ │ ├oldboy-2.avi │ │ ├oldboy-3.avi │ │ ├oldboy-4.avi │ │ ├oldboy-5.avi │ │ ├oldboy-6.avi │ │ ├oldboy-7.avi │ │ ├oldboy-8.avi │ │ └oldboy-9.avi │ ├ │ │ ├01开课介绍.avi │ │ ├02前端技术概要.avi │ │ ├03今日内容概要.avi │ │ ├04Html本质以及在web程序中的作用(一).avi │ │ ├05Html本质以及在web程序中的作用(二).avi │ │ ├06Html本质以及在web程序中的作用(三).avi │ │ ├07html的head内标签.avi │ │ ├08html的body内标签之图标、换行及其他.avi │ │ ├09chrome查看html样式基本操作.avi │ │ ├10html的body内标签之input系列(一).avi │ │ ├11html的body内标签之input系列(二).avi │ │ ├12html的body内标签之多行文本及下来框.avi │ │ ├13html的body内标签之超链接.avi │ │ ├14html的body内标签之图片及表格.avi │ │ ├15html的body内标签之表格.avi │ │ ├16html的body内标签之fieldset标签和label标签.avi │ │ ├17上述内容总结.avi │ │ ├18css选择器.avi │ │ ├19css的存在形式及优先级.avi │ │ ├20css边框以及其他常用样式.avi │ │ ├21css之float样式.avi │ │ ├22css之float实现作业实例.avi │ │ ├23css之display样式.avi │ │ ├24css之内外边距.avi │ │ ├25本周作业以及思路.avi │ │ └day14课上所有.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值