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__}\n"
            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()

猜你喜欢

转载自www.cnblogs.com/west-yang/p/12770472.html