• python基础 day20 re模块、带参数的装饰器


    一、re模块

    • findall search
    import re
    # findall  search
    # re.findall('正则表达式','匹配的字符串')
    ret = re.findall('d+', 'sdfw65274skdjo6231')
    print(ret, type(ret))  #findall 找到的是所有匹配到的内容
    
    # re.search('正则表达式','匹配的字符串')
    ret = re.search('d+', 'sdfwesaf234skdjop231')
    print(ret)  # search 找到的是第一个匹配到的内容
    print(ret.group())
    
    
    ret = re.findall('6(d)d', 'sdfw65274skdjo6231')
    print(ret)  # ['5', '2']
    # findall还是按照完整的正则进行匹配,但是只是显示括号里匹配到的内容
    
    ret = re.search('(6)(d)(d)', 'sdfw65274skdjo6231')
    if ret:
        print(ret.group())  # 652
        print(ret.group(1))  #6
        print(ret.group(2))  # 5
        print(ret.group(3))  # 2
    # search还是按照完整的正则进行匹配,显示也是匹配到的第一个内容,但是可以通过给group传参的方式分别获取具体分组中的内容
    
    • 为什么要用分组?findall的分组优先有什么好处? # 把想要的内容放分组里
    # '2-3*(5+6)'
    # 匹配a+b并计算他们的结果
    ret = re.search('(d+)+(d+)','2-3*(5+6)')
    print(int(ret.group(1))+int(ret.group(2)))
    
    # 取消分组优先   # ()里面最前面加入?:
    ret = re.findall('1(?:d)(d)', '123')
    print(ret)
    
    • split、sub、subn、match、compile、finditer 方法
    # split  # 切割
    ret = re.split('d+', 'aaa123bbb234ccc')
    print(ret)  # ['aaa', 'bbb', 'ccc']
    ret = re.split('(d+)', 'aaa123bbb234ccc')
    print(ret)  # ['aaa', '123', 'bbb', '234', 'ccc']
    
    
    # sub  # 替换(需要指定替换次数)
    ret = re.sub('d+', '-->', 'aaa123bbb234ccc', 2)
    print(ret)  # aaa-->bbb-->ccc
    
    
    # subn  # 替换(直接替换全部,返回一个元组,元组中是替换后的结果和替换的次数)
    ret = re.subn('d+', '-->', 'aaa123bbb234ccc')
    print(ret)  # ('aaa-->bbb-->ccc', 2)
    
    
    # match  # 只能匹配字符串的开头相当于search('^正则表达式', '字符串')
    ret = re.match('d+', '123jason456carly')
    print(ret.group())  # 123
    
    
    # compile  # 节省代码时间的工具
    # 假如同一个正则表达式要被使用多次
    ret = re.compile('d+')
    ret.search('aaa123bbb456')
    ret.findall('aaa123bbb456')
    
    
    # finditer  ## 节省空间
    ret = re.finditer('d+', 'aaa123bbb456ccc789')
    for i in ret:
        print(i.group())
    
    # compile和finditer 一起使用,既节省时间,又节省空间
    ret = re.compile('d+')
    res1 = ret.finditer('aaa123bbb456ccc789')
    res2 = ret.finditer('sdfdsg2345bdfsd66434')
    
    • 分组命名
    # 分组命名  # (?P<分组名字>正则表达式)
    ret = re.search('(w+?)(d)(?P<name>w)(d)', '123456dfdsg56789017')
    print(ret.group())
    print(ret.group('name'))
    
    # 分组命名的引用
    s = '<abc>238945hi</abb>dfoihfndsk</abc>sdfwefergsdf</abb>'
    ret = re.search('<(?P<tag>w+)>.*?</(?P=tag)>', s)
    print(ret.group())
    

    二、带参数的装饰器

    import time
    
    def log(name):
        def wrapper(func):
            def inner(*args, **kwargs):
                s = f"{time.strftime('%Y-%m-%d %H:%M:%S')}执行了{func.__name__}
    "
                ret = func(*args, **kwargs)
                with open(name, 'a' ,encoding='utf-8') as f1:
                    f1.write(s)
                time.sleep(2)
                return ret
            return inner
        return wrapper
    
    @log('login.log')
    def login():
        print('登录函数')
    
    
    @log('register.log')
    def register():
        print('注册函数')
    
    @log('fuck.log')
    def fuck():
        print('fuck函数')
    
    @log('gogogo.log')
    def gogogo():
        print('gogogo函数')
    
    
    login()
    register()
    fuck()
    gogogo()
    
  • 相关阅读:
    Asp.Net Core 3.1 使用Autofac Aop
    Abp中的工作单元UnitOfWork的Aop是如何实现的
    Asp.Net Core 3.1 Api 集成Abp项目AutoMapper
    Asp.Net Core 3.1 Api 集成Abp项目动态WebApi
    php限制登录次数
    vbs小实例
    php导出数据到excel
    mysqli单例模式连接数据库
    微信JsApi支付
    HTML5新增表单控件
  • 原文地址:https://www.cnblogs.com/west-yang/p/12770472.html
Copyright © 2020-2023  润新知