文章目录

    • 正则相关函数
      • search 和 match
      • split 切割
      • sub 替换
      • finditer 匹配字符串中相应内容,返回迭代器
      • compile 指定一个统一的匹配规则
      • 正则表达式的修饰符
    • 类中的方法
    • 装饰器 @property
  • 异常
    • 异常分类
    • 异常处理
    • 主动抛出异常 raise

正则相关函数

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("小狗喜欢舔")# 绑定到类方法@classmethoddef la(cls):print(cls)print("小狗会吃屎")# 静态方法@staticmethoddef 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#获取@propertydef username(self):return self.name# pass#设置@username.setterdef username(self,val):self.name = val# pass#删除@username.deleterdef username(self):del self.name# passobj = 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 浮点计算错误
GeneratorExit generator.close()方法被调用的时候
ImportError 导入模块失败的时候
KeyboardInterrupt 用户输入中断键(Ctrl+c)
MemoryError 内存溢出(可通过删除对象释放内存)
NotImplementedError 尚未实现的方法
OSError 操作系统产生的异常(例如打开一个不存在的文件)
OverflowError 数值运算超出最大限制
ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError 一般的运行时错误
SyntaxError Python的语法错误
TabError Tab和空格混合使用
SystemError Python编译器系统错误
SystemExit Python编译器进程被关闭
TypeError 不同类型间的无效操作
UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
UnicodeError Unicode相关的错误(ValueError的子类)
UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
UnicodeTranslateError Unicode转换时的错误(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 = 5b = 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 1yield 2return "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:passres = issubclass(Exception,BaseException)
print(res) # True
  • 完整写法
try:# 必须嵌入在try这个代码块里面使用;raise BaseException
except BaseException:print("这个程序抛出了异常")# 简写写法
try:raise
except:print("程序异常")
  • 自定义异常类
# return_errorinfo 必须要依靠抛异常的形式才能触发获取当前的行号或者文件名
def return_errorinfo(n):import sysf = sys.exc_info()[2].tb_frame.f_backif n==1:      return str(f.f_lineno)      #返回当前行数elif n == 2:   return f.f_code.co_filename #返回文件名  def get_info(n):try:raiseexcept: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_filenamehuman_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)

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

  1. python类的魔法方法和装饰器

    装饰器 闭包装饰器 装饰器的本质就是一个闭包, 闭包三要素:1 函数嵌套, 2 外部函数返回内部函数的引用, 内部函数使用外部函数的变量 1 使用装饰器简单实现一个登录校验功能 In [1]: use ...

  2. 类中的三个装饰器方法

    @classmethod class A:__count = 0 #隐藏count属性def __init__(self,name):self.name = nameself.__add_count( ...

  3. python获取方法的装饰方法_python中的方法和装饰器

    [TOC] 装饰器 python中的装饰器(decorator)是在pep 318中被首次引入,它的本质是一个函数这个函数是接受其它参数为参数,并且用一个新的,修改后的函数作为替换,最常见的装饰器就c ...

  4. python中msg函数_Python 中闭包函数和装饰器

    一.闭包函数的概述 闭包 closure, 是一种代码的组织结构.当一个内嵌函数引用其外部作用域的变量,就形成一个闭包函数.闭包函数有一个内嵌函数,内嵌函数引用外部函数中的变量,外部函数的返回值是内嵌 ...

  5. python方法定义..._解析Python类中的方法定义

    最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客.文章研究到底是怎么一回事.因为有的文章所陈述与我在python3.5版本实际实验中有些出入,所以经过实践后总结出以下结论. ...

  6. python装饰器特性iy雾_扣丁学堂简述Python 装饰器装饰类中的方法

    扣丁学堂简述 Python 装饰器装饰类中的方法 本篇文章小编主要和读者们分享一下 Python 装饰器装饰类中的方法, 文中会有详细的代码 列出供大家参考,下面随小编一起来了解一下吧. 有一个类 T ...

  7. Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数

    一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...

  8. python装饰器类-Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  9. python装饰器实例-基于Python 装饰器装饰类中的方法实例

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

最新文章

  1. python机器学习可视化工具Yellowbrick介绍及平行坐标图实战示例
  2. ubuntu 安装docker_Docker: 教程04 - (初始化安装之在 Ubuntu 安装Docker CE)
  3. hikari数据源配置类_Spring中的“多数据源”之详解
  4. Python(60)_闭包
  5. Core IO学习心得
  6. (2)基于Bootstrap的网页开发
  7. Pentium Pro架构/流水线及其优化 (3) - 指令流水线/乱序执行核/高速缓存/分支预测/指令预取
  8. 昆明理工大学c语言设计大作业,昆明理工大学大一C语言大作业题目
  9. WIN10 企业版 LTSC 激活
  10. Misra-C编码规范全解读 - Misra C 概述
  11. C# 如何生成CHM帮助文件
  12. aoc s32p Android 内存,一机两用!AOC企鹅影霸 S32P显示器评测
  13. 学计算机的考研254分,2011年考研:历史学专业课254分经验谈
  14. CSDN20181213博客黑板报
  15. sql2005的级联和子查询
  16. 电脑端工具☞高效率办公软件,值得推荐
  17. SAP 04-CONTAINER 使用DOCKING停靠容器示例
  18. 基于Ubuntu的Arduino安装(Arduino官网下载自己需要的版本)
  19. 【Unity3D】无法正确获取RectTransform的属性值导致计算出错
  20. win10设置全局护眼绿模式

热门文章

  1. 公司网站被黑客入侵,怎么应对?
  2. 如何用java读取并解析geojson文件
  3. 【ACWing】748. 数组的右下半部分
  4. mini6410 用fb显示bitmap
  5. 修改ssh命令行[root@xxx]#颜色
  6. 【C语言经典100例】-- 06 用*号输出字母C的图案
  7. adb shell am 命令(活动管理)
  8. 萧乾升:4.2黄金白银TD原油休市下周实时行情分析走势
  9. 【Python】强烈推荐的50个Pandas常用高级操作(建议收藏)
  10. php学籍信息管理系统心得_php学生信息管理系统