1.re模块 正则表达式(键盘上的符号组合,构成规则,筛选内容)
import re res = re.findall('l', 'hello world 123') # findall 找成功一次后找到所有 print(res)
1、\w 匹配包括下划线的任何单词字符(等价于[A-Za-z0-9 ]) \W 匹配任何非单词字符 (等价于[^A-Za-z0-9 ])
import re print(re.findall('\w',"hello\e wdl zx 123_")) print(re.findall('\W',"hello\e wdl zx 123_"))
2、\s 匹配任何空白字符,包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v]) \S 匹配任何非空白字符(等价于[^\f\n\r\t\v])
import re print(re.findall('\s',"hello\e wdl zx 123_")) print(re.findall('\S',"hello\e wdl zx 123_"))
3、 \d 匹配从 0 到 9 中的任意一个数字字符(等价于 [0-9]) \D 匹配非数字字符(等价于 [^0-9])
import re print(re.findall('\d',"hello\e wdl zx 123_")) print(re.findall('\D',"hello\e wdl zx 123_"))
4、 ^ 匹配行首,例如'^dog'匹配以字符串dog开头的行(注意:awk 指令中,'^'则是匹配字符串的开始) $ 匹配行尾,例如:'^、dog$'匹配以字符串 dog 为结尾的行(注意:awk 指令中,'$'则是匹配字符串的结尾)
import re print(re.findall("^egon","heegonllo egon xxx egon yyy egon")) heegonllo egon xxx egon yyy egon ^egon print(re.findall("^egon","egonllo egon xxx egon yyy egon")) print(re.findall("egon$","egonllo egon xxx egon yyy egon1"))
5、 \t 匹配一个横向制表符(等价于 \x09和 \cI) \n 匹配一个换行符(等价于 \x0a 和\cJ)
import re print(re.findall("\n","a\nb\tc\n")) print(re.findall("\t","a\nb\tc\n"))
6、 . 匹配除换行符('\n')之外的任意单个字符(注意:awk 指令中的句点能匹配换行符)
import re print(re.findall("a.c","a1c a+c abc aAc a c aaaaac a\nc a\tc")) print(re.findall("a.c", "a1c a+c abc aAc a c aaaaac a\nc a\tc", re.DOTALL)) #让你的点可以匹配所有
7、 []: 代表匹配一个字符,该字符可以是指定的字符
print(re.findall("a[1A]c","a1c a+c abc aAc a c aaaaac a\nc a\tc")) print(re.findall("a[0-9]c","a1c a+c abc aAc a c aaaaac a\nc a\tc")) print(re.findall("a[a-zA-Z]c","a1c a+c abc aAc a c aaaaac a\nc a\tc"))
print(re.findall("a[+*\-]c", "a1c a+c abc a-c a*c a\c aAc a c aaaaac a\nc a\tc")) #这个减号左右均有东西代表范围,r代表里面是原生字符串 print(re.findall(r"a[+*\\-]c", "a1c a+c abc a-c a*c a\c aAc a c aaaaac a\nc a\tc")) #\代表转移意思,\\ print(re.findall(r"a[-+*\\]c", "a1c a+c abc a-c a*c a\c aAc a c aaaaac a\nc a\tc")) print(re.findall(r"a[^-+*\\]c", "a1c a+c abc a-c a*c a\c aAc a c aaaaac a\nc a\tc")) #[]内加^代表取反;^加在外面代表从头开始匹配
8、 *:左边那一个符号出现0次到无穷次 ?:左边那一个符号出现0次到1次 +:左边那一个符号出现1次到无穷次 {n,m}:左边那一个符号出现n次到m次
print(re.findall("ab*",'a ab abbb abbbb bbbba')) print(re.findall("ab?","a ab abbb abbbb bbbba")) print(re.findall("ab+","a ab abbb abbbb bbbba")) print(re.findall("ab{0,1}","a ab abbb abbbb bbbba")) print(re.findall("ab{0,}","a ab abbb abbbb bbbba")) print(re.findall("ab{1,}","a ab abbb abbbb bbbba")) print(re.findall("ab{3,5}","a ab abbb abbbb bbbba"))
print(re.findall("compan(ies|y)", "Too many companies have gone bankrupt, and the next one is your company")) print(re.findall("compan(?:ies|y)", "Too many companies have gone bankrupt, and the next one is your company")) #?:取消分组,保留最全的东西 .* print(re.findall('a.*c', 'a1231231+-c666666666c11111111')) print(re.findall('a.*?c', 'a1231231+-c666666666c11111111')) #.*后面加?,把贪婪的变成非贪婪的
2.logger模块 CRITICAL = 50 #FATAL = CRITICAL # CRITICAL:危险的 ERROR = 40 WARNING = 30 #WARN = WARNING 即将发生风险 INFO = 20 #常规日志 info:信息情报 DEBUG = 10 #调试级别 开发过程中记调试日志 debug:调试除错 NOTSET = 0 #不设置 自上而下接收
logger 给日志打标签 filter 过滤 handler 控制日志输出到哪的 formatter 控制日志输出格式 logging_dic 配置日志用字典
定义三种日志输出格式,日志中可能用到的格式化串如下 %(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s用户输出的消息
日志配置字典
LOGGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'formatter1': { 'format': fm1 #时间+内容 %(asctime)s:%(message)s }, 'formatter2': { 'format': fm2 }, }, 'filters': {}, 'handlers': { #打印到终端的日志 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': 'formatter2' }, #打印到文件的日志,收集info及以上的日志 'fh1': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': 'formatter1', 'filename': LOG1_PATH, 'encoding': 'utf-8', }, 'fh2': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': 'formatter1', 'filename': LOG2_PATH, 'encoding': 'utf-8', }, }, 'loggers': { '': { 'handlers': ['console','fh1','fh2'], 'level': 'DEBUG', 'propagate': False, }, '用户相关': { 'handlers': ['console','fh1'], 'level': 'DEBUG', 'propagate': False, }, '交易相关': { 'handlers': ['console','fh1','fh2'], 'level': 'DEBUG', 'propagate': False, }, }, }
3.序列化模块 序列化:内存中数据类型转换成一种特殊格式,可以存硬盘,可以沿网络发给另外软件 反序列化: 1 序列化 dic = {'name':"egon","age":18}
str_dic = str(dic) with open('a.txt',mode='wt',encoding='utf-8') as f: f.write(str_dic) 2、反序列化 with open('a.txt',mode='rt',encoding='utf-8') as f: dic = eval(f.read()) # "{'name': 'egon', 'age': 18}" #eval()将字符串里的代码拿出来运行 print(dic['name']) 存档 跨平台交互数据(需要一种通用的数据格式) 1、存档(pickle)
import pickle import json dic = {'name': "egon", "age": 18.5, "k1": True, 'k2': None, 'k3': (1, 2, 3), 'k4': {1, 2, 3}} json.dumps(dic) # 报错 dic_pkl = pickle.dumps(dic) print(dic_pkl,type(dic_pkl)) with open('a.pkl',mode='wb') as f: f.write(dic_pkl) with open('a.pkl',mode='wb') as f: pickle.dump(dic,f) with open('a.pkl', mode='rb') as f:
方式一
res = f.read() dic = pickle.loads(res) print(dic)
方式二
res = pickle.load(f) print(res)
2、跨平台交互数据(需要使用一种通用的数据格式->json) ====================json 格式的序列化与反序列化1
import json dic = {'name':"egon","age":18.5,"k1":True,'k2':None,'k3':(1,2,3)} json_str = json.dumps(dic) print(json_str,type(json_str)) with open('a.json',mode='wt',encoding='utf-8') as f: f.write(json_str) with open('a.json',mode='rt',encoding='utf-8') as f: json_str = f.read() res = json.loads(json_str) print(res,type(res))
====================json 格式的序列化与反序列化2
dic = {'name':"egon","age":18.5,"k1":True,'k2':None,'k3':(1,2,3)} with open('a.json',mode='wt',encoding='utf-8') as f: json.dump(dic,f) with open('a.json',mode='rt',encoding='utf-8') as f: res = json.load(f) print(res,type(res))
猴子补丁
import json import ujson # pip3 install ujson def monkey_patch(): json.dumps = ujson.dumps json.loads = ujson.loads monkey_patch() json.dumps json.loads