一、re模块
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()