zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    百度面试题
    分治法--二分查找、乘方、斐波那契数
    01-11李宁老师学Python视频课程(1):初识Python返回课程
    邮件发送的两种实现方法。
    Docker(一):Docker入门教程
    安装docker及在docker中安装python环境学
    vim编辑器的使用和CentOS有很多不同
    大一编程基础培训]==02-03-04-05课==类型
    大一编程基础培训]==08课==条件判断]==07课==Python的LIST与TUPLE数据类型
    Beautiful Soup 4.2.0 文档¶ BeautifulSoup对象内任何第一个标签入口,使用find()方法。
  • 原文地址:https://www.cnblogs.com/west-yang/p/12770472.html
Copyright © 2011-2022 走看看