day22-Python运维开发基础(正则函数 / 异常处理)

 

1. 正则函数

day22-Python运维开发基础(正则函数 / 异常处理)_第1张图片

 

 

# ### 正则表达式 => 正则函数
import re
# search   通过正则匹配出第一个对象返回,通过group取出对象中的值
strvar = "5*7 9/8"
obj = re.search("(\d+)[*/]\d+",strvar)
print(obj)
# group 获取匹配的内容
res = obj.group()
print(res)
res = obj.groups()
print(res)

# match    验证用户输入内容
"""search在正则表达式的前面加上^ 就与math函数一模一样"""
strvar = "17166668888"
strvar = "y17166668888"
obj = re.search("^\d+",strvar)
# print(obj.group())
print(obj)

obj = re.match("\d+",strvar)
# print(obj.group())
print(obj)

# split    切割
strvar = "alex|wusir|xboyww-xgirlww"
lst = strvar.replace("-","|").split("|")
print(lst)

# - 具有特殊的含义,使用时需要转义
strvar = "alex|wusir-xboyww&xgirlww"
res = re.split(r"[|\-&]",strvar)
print(res)

strvar = "alex2342wusir23423423242xboyww2222222xgirlww"
res = re.split("\d+",strvar)
print(res)

# split(正则表达式,字符串,[选择分割的次数,可选]) 返回列表
res = re.split("\d+",strvar,1)
print(res)

# sub      替换  返回的结果是一个字符串
strvar = "alex|wusir-xboyww&xgirlww"
res = re.sub(r"[|&-]","%",strvar)
print(res)
# sub(正则表达式,要替换的字符串,原字符串,[选择替换的次数,可选]) 返回字符串
res = re.sub(r"[|&-]","%",strvar,1)
print(res)

# subn     替换 用法上与sub一样,但是返回的结果是元组,(替换后的结果,替换的次数)
strvar = "alex|wusir-xboyww&xgirlww"
res = re.subn(r"[|&-]","%",strvar,1)
print(res)

# finditer 匹配字符串中相应内容,返回迭代器
"""findall 与 finditer用法一样,区别在于 findall返回的是列表,finditer返回迭代器"""
from collections import Iterator,Iterable
strvar = "sdfsd&^*12招待费34sdf"
it = re.finditer("\d",strvar)
# 判断是否是迭代器
res = isinstance(it,Iterator)
print(res)

for i in it:
    # print(i)  #<_sre.SRE_Match object; span=(8, 9), match='1'>
    res = i.group()
    print(res)


# compile  指定一个统一的匹配规则
"""
正常情况下,需要先编译好正则表达式,再去执行匹配
如果频繁的反复使用,浪费时间和空间

所以使用compile 用来编译一次,终身受益,不用对同一个正则反复编译啦
"""
strvar = "sdfsd&^*12招待费34sdf"
pattern = re.compile("\d")
print(pattern)
res = pattern.findall(strvar)
print(res)


# 修饰符
# re.I 使匹配对大小写不敏感
strvar = "

这是一个大标题

" pattern = re.compile("

(.*?)

",flags=re.I) obj = pattern.search(strvar) print(obj) print(obj.group()) print(obj.groups()) # re.M 使每一行都能够单独匹配(多行匹配),影响 ^ 和 $ strvar = """sdfsdfsd

234234234

^&^&&%
""" pattern = re.compile("^<.*?>(.*?)<.*?>$",flags=re.M) obj = pattern.search(strvar) print(obj.group()) print(obj.groups()) lst = pattern.findall(strvar) print(lst) # re.S 使 . 匹配包括换行在内的所有字符 strvar = """ give 123mefive """ pattern = re.compile(".*?mefive",flags=re.S) obj = pattern.search(strvar) print(obj) """ # 不加修饰符,加上修饰,两个结果的差别; 123mefiiv \ngive\n123mefive """ # 使用多个修饰符的写法 (拓展) strvar = """sdfsdfsd

234234234

^&^&&%

""" pattern = re.compile("^<.*?>(.*?)

$
",flags=re.I|re.S) obj = pattern.search(strvar) print(obj.group()) print(obj.groups())
正则函数 示例代码

 

2. module(与类相关的魔术属性 / 反射 / sys.modules)

day22-Python运维开发基础(正则函数 / 异常处理)_第2张图片

 

 

# ### (1)与类相关的魔术属性
class Man():
    pass

class Woman():
    pass
    
class Children(Man,Woman):
    """
    成员属性:eye skin
    成员方法:eat cry 私有sleep
    """
    
    eye = "天蓝色"
    skin = "天蓝色"
    
    def eat(self):
        print("小孩下来就会吃奶奶")
        
    def cry(self,func):
        print("小孩哭起来,地动山摇,天崩地裂,海枯石烂")
        print(func.__name__,type(func.__name__)) # 可以获取函数名或者类名
    
    def __sleep():
        print("小孩睡觉的时候,不喜欢别人干扰它")

obj = Children()
# __dict__ 获取对象或类的内部成员结构
# 对象
res = obj.__dict__
print(res)
#
res = Children.__dict__
print(res)
    
# __doc__  获取对象或类的内部文档
print(Children.__doc__)
    
# __name__ 获取类名函数名
def abc():
    print("abc")
obj.cry(abc)

# __class__ 获取当前对象所属的类
res = obj.__class__
print(res)

# __bases__ 获取一个类直接继承的所有父类,返回元组
print(Children.__bases__)

# ### (2) 反射
# 通过字符串去操对象 或者 模块中的属性方法

# (1)类中的反射
# 1.hasattr() 检测对象/类是否有指定的成员
# 对象
res = hasattr(obj,"eye")
print(res)
res = hasattr(obj,"eat")
print(res)

#
res = hasattr(Children,"skin")
print(res)

# 2.getattr() 获取对象/类成员的值
# 对象
res = getattr(obj,"eye")
print(res)
# 通过对象把方法反射出来,是绑定方法
func = getattr(obj,"eat")
print(func)
func()
# 通过类把方法反射出来,是普通方法
func = getattr(Children,"eat")
print(func)
func(1)
# 可以为getattr设置默认值,如果找不到该成员,在第三个参数上可以设置相应的返回值
res = getattr(Children,"abc","对不起,没有该成员")
print(res)

# 小应用
"""
strvar = input("请输入你要操作的成员:")
if hasattr(obj,strvar):
    func = getattr(obj,strvar)
    func()
else:
    print("对不起,没有该成员")
"""

# 3.setattr() 设置对象/类成员的值
# 对象
setattr(obj,"hair","天蓝色的")
print(obj.hair)
#
setattr(Children,"age",lambda : print("小孩下生后,是一个肉球"))
Children.age()


# 4.delattr() 删除对象/类成员的值 
# 对象
delattr(obj,"hair")
# print(obj.hair)
#
delattr(Children,"age")
# Children.age()



# (2)模块的反射
import sys
# sys.modules 返回一个系统字典,字典的键是加载的所有模块
print(sys.modules)
"""
__main__
{'builtins': , 'sys': , '_frozen_importlib': , '_imp': , '_warnings': , '_thread': , '_weakref': , '_frozen_importlib_external': , '_io': , 'marshal': , 'posix': , 'zipimport': , 'encodings': , 'codecs': , '_codecs': , 'encodings.aliases': , 'encodings.utf_8': , '_signal': , 
'__main__': , 'encodings.latin_1': , 'io': , 'abc': , '_weakrefset': , 'site': , 'os': , 'errno': , 'stat': , '_stat': , 'posixpath': , 'genericpath': , 'os.path': , '_collections_abc': , '_sitebuiltins': , '_bootlocale': , '_locale': , 'sysconfig': , '_sysconfigdata_m_linux_x86_64-linux-gnu': , 'sitecustomize': , 'encodings.cp437': }

"""
mymodule = sys.modules["__main__"]
print(mymodule)

def func1():
    print(1)

def func2():
    print(2)

def func3():
    print(3)

def func4():
    print(4)

# 通过字符串操作模块中的成员
while True:
    func = input("请用户输入您要操作的函数")
    if hasattr(mymodule,func):
        # 反射真实的函数
        fuc = getattr(mymodule,func)
        fuc()
    else:
        print("这个函数不存在")
与类相关的魔术属性_反射_sys.modules 示例代码

 

3. 异常处理

day22-Python运维开发基础(正则函数 / 异常处理)_第3张图片

 

 

# ### 了解异常处理


# IndexError                索引超出序列的范围
# lst = [1,2,3]
# print(lst[100])


# KeyError                  字典中查找一个不存在的关键字
# dic =  {"a":1}
# print(dic["b"])


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


# IndentationError          缩进错误
"""
if 5 == 5:
    print(1)
    print(2)
"""
# AttributeError            尝试访问未知的对象属性
class MyClass():
    a = 5

obj = MyClass()
# obj.b


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

# AssertionError             断言语句(assert)失败
# assert 5>3
# assert 猜一猜 5<2是不是正确的,如果错误,直接抛出异常
assert 5<2
了解异常 示例代码
# ### 异常处理
"""
try:
    code1
except:
    code2
    
把可能存在问题的代码放到try这个代码块之后,
如果出现异常直接执行except这个代码块里面内容
如果没有异常,就不走except;
"""

# 1.基本语法
try:
    lst = [1,2,3]
    print(lst[100])
except:
    pass


# 2.带有分支的异常处理
try:
    # lst = [1,2,3]
    # print(lst[100])
    
    # dic = {"a":1}
    # print(dic["b"])
    
    print(wangwen)
    
except IndexError:
    print("我是IndexError错误类")
except KeyError:
    print("我是KeyError错误类")
except:
    print("有异常错误")
    
# 3.解决StopIteration错误异常,并且获取返回值
def gen():
    yield 1
    yield 2
    return 334343
    
# 初始化生成器 => 返回生成器对象 => 简称生成器


"""StopIteration as e 是给StopIteration这个类实例化出来的对象起别名叫e"""
try:
    mygen = gen()

    res = next(mygen)
    res = next(mygen)
    res = next(mygen)
except StopIteration as e:
    """
    对象可以直接打印,会自动触发__str__魔术方法,
    在系统内部自动接收return的返回值
    在打印对象时候,自动打印返回值
    """
    print(e)
    print("我是StopIteration错误")
    
    
# 4.关于异常处理的扩展写法
# try ... finally 如果再报错时,也必须要执行,就使用finally
"""
try:
    print(wangwen)
finally:
    print(1)
    print(2)
print(3)
"""
# try ... except ... else
# 如果不报错就走else分支,报错了就不执行else
"""
try:
    # print(lisi)
    print(1234)
except:
    pass
else:
    print(1)
    print(2)
"""

# finally 和 else 不能够同时存在
"""
try:
    print(wangwen)
except:
    pass
finally:
    print(5)
else:
    print(6)
"""

# for/while ... else ... (了解)
"""
如果循环异常终止(break,或者在函数中通过return终止的),不走else分支
"""
for i in range(10):
    # if i == 5:
        # break
    pass
else:
    print(111222)
异常处理 示例代码
# ### 主动抛出异常 raise
"""
所有异常类的父类(基类,超类)     BaseException
所有普通异常类的父类(基类,超类) Exception

raise + 异常类/异常类的对象

"""
# (1) 基本用法
try:
    raise BaseException
except BaseException:
    pass

# 简写
"""raise 后面如果什么也不写 , 默认抛出的是BaseException"""
try:    
    raise
except :
    pass
    
# (2) 自定义异常类

# 只能在异常的情况下,才能获取到相应的数据
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 #返回文件名    


# 自定义异常类:(必须继承BaseException异常类父类)
class MyException(BaseException):
    def __init__(self,num,msg,file,fileline):
        # 错误号码
        self.num = num
        # 错误消息
        self.msg = msg
        # 错误文件
        self.file = file
        # 错误行号
        self.fileline = fileline
        
# get_info 通过抛出异常触发return_errorinfo函数,从而获取异常的行号和文件
def get_info(n):
    try:
        raise
    except:
        return return_errorinfo(n)
        
        
# 实际使用
sex = "中性"
try:
    if sex == "中性":
        # 主动抛出异常 (对象)
        raise MyException(200,"人类没有中性的",get_info(2),get_info(1))
except MyException as e:

    print("错误的号码是{}".format(e.num))
    print("错误的原因是{}".format(e.msg))
    print("错误的文件是{}".format(e.file))
    print("错误的行号是{}".format(e.fileline))
主动抛出异常raise 示例代码

 

 

 

 

 

day22

你可能感兴趣的:(day22-Python运维开发基础(正则函数 / 异常处理))