16、正则表达式、序列化与反序列化、猴子补丁、时间模块、random模块

一、re模块

正则表达式:

模式 概述
\w 匹配字母数字及下划线
\W 匹配非字母数字下划线
\s 匹配任意空白字符,包括(\n\t\r\f)
\S 匹配任意非空字符
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字
\A 匹配字符串开始(只找开头的第一个)
\Z 匹配字符串结束,如果存在换行则在换行前结束
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的结尾
. 匹配任意字符串,除了换行符,当re.DOALL标记,匹配任意
[...] 用来表示一组字符,单独列出:[amk]匹配'a','m'或'k'
[^...] 不在[]中的字符:[ ^abc ]匹配除了a,b,c之外的字符
* 匹配0个或多个的表达式,贪婪方式
+ 匹配1个或多个的表达式
匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
精确匹配n个前面的表达式
匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a|或者b
() 匹配括号内对的表达式,也表示一个组

二、序列化与反序列化(eval)

1、什么是序列化(为了跨平台)

​ 序列化指的是把内存的数据类型转换成一个特定的格式的内容

​ 该格式的内容可用于存储活着传输给其他平台使用

​ 内存中的数据类型----->序列化------>特定的格式(json格式或者pockle)

2、为何要序列化

​ 序列化得到的结果---->特定格式的内容有两种用途:

​ 2.1、可以用于存储--->用于存档

​ 2.2、传输给其他平台使用---->跨平台数据交互

​ 强调!!

​ 针对用途1的特定格式:一种专用的格式pickle:只有python可以识别。

​ 针对用途2的特定格式:应该是一种通用的,能够被所有语言识别的格式

​ json

3、如何序列化与反序列化

#序列化
import json
res=json.dumps([1,'aaa',True,False])
print(res)
#输出结果
[1, "aaa", true, false]#单引号==双引号,布尔值都小写
#反序列化
l=json.loads(res)
print(l)
#输出结果
[1, 'aaa', True, False]
import json
#序列化
# res=json.dumps([1,'aaa',True,False])
# with open('test.json',mode='wt',encoding='utf-8')as f:
# f.write(res)
#简单化
with open('test.json', mode='wt', encoding='utf-8')as f:
    json.dump([1,'aaa',True,False],f)


#反序列化
# with open('test.json',mode='rt',encoding='utf-8')as f2:
#     res=f2.read()
#     l=json.loads(res)
#简单化
with open('test.json',mode='rt',encoding='utf-8')as f2:
    l=json.load(f)

用法完全适用于pickle!!

补充:
json格式兼容的是所有语言通用的数据类型,不能识别某一语言的所独有的
类型。

json强调!!
l= json.loads('[1,"aaa",ture,false]')
#格式没有单引号!没有大True与大Flase

三、猴子补丁

#猴子补丁只是一种思想,一种戏谑的称呼

#本质原理:讲json中的dumps与dump,load与loads都替换成ujson的功能来提高效率,将其定义为一个函数,方便后续调用

import json
import ujson # pip3 install ujson安装ujson

def monkey_patch_json():
    json.dump = ujson.dump
    json.dumps = ujson.dumps
    json.load = ujson.load
    json.loads = ujson.loads

monkey_patch_json()

四、时间模块

​ 时间分为三种格式

1、时间戳
print(time.time())

2、格式化的字符串
print(time.strftime('%Y-%m-%H'))

3、结构化的时间
res = time.localtime()
print(res)

#三者之间的格式可以通过内置的功能相互转换

​ datetime模块

import datetime

print(datetime.datetime.now())

print(datetime.datetime.now() + datetime.timedelta(days=3.5))

print(datetime.datetime.now() - datetime.timedelta(days=3.5))
#这个datetime模块可以相互加减天数,时间

五、random模块

import random

print(random.random())#(0,1)----float   大于0且小于1之间的小数

print(random.randint(1,3)) #[1,3]大于等于1且小于等于3之间的整数

print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数

print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5]

print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合

print(random.uniform(1,3))
#大于1小于3的小数,如1.927109612082716

item=[1,3,5,7,9]
random.shuffle(item) #打乱item的顺序,相当于"洗牌"
print(item)
#编写的随机生成的验证码(字母加数字)

print(ord('A'))#利用ASIC码的特性,将字母转为数字
print(ord('Z'))
print(chr(65))

def make_code(size=4):
    res = ''
    for i in range(size):
        num = str(random.randint(0,9))
        s = chr(random.randint(65,90))
        res += random.choice([num,s])
    return res


print(make_code(6))#可以通过指定参数来设置位数
posted @ 2021-01-06 21:07  BaiM0  阅读(194)  评论(0编辑  收藏  举报