今日内容概要
- re模块补充说明
- collections模块
- time模块
- 时间类型的转换
- datetime模块
- random模块
今日内容详细
一、re模块补充说明
1、findall的优先级查询
"""
findall默认是分组优先展示
正则表达式中如果有括号分组 那么在展示匹配结果的时候
默认只演示括号内正则表达式匹配到的内容!!!
也可以取消分组有限展示的机制
(?:) 括号前面加问号冒号
"""
import re
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']
2、search 的索引获取
import re
ret = re.search('a', 'eva jason yuan').group()
print(ret) #结果 : 'a'
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
import re
ret = re.search('a(b)c', 'abcabcabcabc')
print(ret.group()) # abc
print(ret.group(0)) # abc
print(ret.group(1)) # b 可以通过索引的方式单独获取分组内匹配到的数据
'''针对search和match有几个分组 group方法括号内最大就可以写几'''
# 分组之后还可以给组起别名
import re
ret = re.search('a(?P<name1>b)(?P<name2>c)', 'abcabcabcabc')
print(ret.group('name1')) # b
print(ret.group('name2')) # c
3、split 的优先级查询
ret=re.split("\d+","eva3jason4yuan")
print(ret) #结果 : ['eva', 'jason', 'yuan']
ret=re.split("(\d+)","eva3jason4yuan")
print(ret) #结果 : ['eva', '3', 'jason', '4', 'yuan']
#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。
二、collections模块
1、namedtuple 具名元组
- 定义:生成可以使用名字来访问元素内容的tuple
from collections import namedtuple # 导入模块
- 格式:
namedtuple('名称', [属性list])
"""具名元组的使用场景也非常的广泛 比如数学领域、娱乐领域等"""
# 1.具名元组
from collections import namedtuple
# 1.先产生一个元组对象模板
# point = namedtuple('坐标',['x','y'])
# 2.创建诸多元组数据
# p1 = point(1,2)
# p2 = point(10,8)
# print(p1,p2) # 坐标(x=1, y=2) 坐标(x=10, y=8)
# print(p1.x) # 1
# print(p1.y) # 2
# person = namedtuple('人物','name age gender')
# p1 = person('jason',18,'male')
# p2 = person('kevin',28,'female')
# print(p1,p2) # 人物(name='jason', age=18, gender='male') 人物(name='kevin', age=28, gender='female')
# print(p1.name,p1.age) # jason 18
"""具名元组的使用场景也非常的广泛 比如数学领域、娱乐领域等"""
card = namedtuple('扑克牌', ['花色', '点数'])
c1 = card('黑桃♠', 'A')
c2 = card('黑梅♣', 'K')
c3 = card('红心❤', 'A')
print(c1, c2, c3)
print(c1.点数)
2、deque 双端队列
- 定义:可以快速的在两端追加和推出对象
- 队列:先进先出 默认是只有一端只能进另外一端只能出
- 双端队列:两端都可以进出
- 使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低,deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
# deque双端队列
from collections import deque # 导入模块
a = deque(['a','b','c'])
a.append('x') # 默认为末尾添加a
a.appendleft('y') # # 左边添加y
print(a)
需要知道的是:
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
3、字典相关(OrderedDict、defalutdict)
- OrderedDict:有序字典
Defalutdict:带有默认值的字典 - 字典内部的key默认是无序的,我们在对字典做迭代时,无法确定key的顺序
如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3), ('d', 2)])
print(d.keys()) # dict_keys(['a', 'b','d', 'c'])默认是无序的
ad = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 2)])
print(ad.keys()) # odict_keys(['a', 'b', 'c', 'd'])有序了
"""需要注意的是,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:"""
ad['x'] = 1
ad['y'] = 2
ad['z'] = 3
print(ad.keys()) # odict_keys(['a', 'b', 'c', 'd', 'x', 'y', 'z'])
# 按照插入的Key的顺序返回
- 在使用字典时,如果引用的key不存在,就会出现报错,如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
print(dd['key1']) #键存在 结果是: 'abc'
print(dd['key2']) #键不存在 结果是:'N/A'
大小存值:
"""
有如下值集合 [11,22,33,44,55,67,77,88,99,999],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
"""
from collections import defaultdict
values = [11, 22, 33,44,55,67,77,88,99,90]
my_dict = defaultdict(list) # 字典所有的值默认都是列表kv形式,就不需要自己写kv键值对的格式了
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
print(dict(my_dict)) # {'k2': [11, 22, 33, 44, 55], 'k1': [67, 77, 88, 99, 90]}
4、Counter : 计数器
- 定义:主要用来记录每一个元素出现的次数
from collections import Counter
c = Counter(['a','b','c','c'])
print(c)
#结果 Counter({'c': 2, 'a': 1, 'b': 1})
之前学的统计字符串中所有字符出现的次数,要进行循环统计,现在不需要了,用Counter就好
之前所学代码如下:
res = 'abcdeabcdabcaba'
new_dict = {}
for i in res:
if i not in new_dict:
# 字符第一次出现 应该创建一个新的键值对
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict) # {'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}
三、time 模块
1、常用方法
1)time.sleep(secs)
推迟指定的时间运行,单位为秒
2)time.time()
获取当前时间戳
2、三种用于表示时间的格式
1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
2)格式化时间
这也是人最容易接收的一种时间格式 2000/1/21 11:11:11
time.strftime()
'%Y-%m-%d %H:%M:%S' # 2022-03-29 11:31:30
'%Y-%m-%d %X' # 2022-03-29 11:31:30
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
3)结构化时间
这种时间类型主要是给计算机看的,人看起来不太方便
time.localtime()
四、 时间类型的转换
几种格式之间的转换
格式化时间 <==> 结构化时间 <==> 时间戳
# 时间戳<-->结构化时间
gmtime
localtime
# 结构化时间<-->格式化时间
strftime
strptime
time.strptime("2017-03-16","%Y-%m-%d")
time.strptime("2017/03","%Y/%m") 前后必须一致
ps:UTC时间比我所在的区域时间早八个小时(时区划分)
五、 datetime 模块
date 意思就是年月日
datetime 意思就是年月日 时分秒
1、datetime.now() 获取当前时间
from datetime import datetime
a=datetime.now()
print('当前日期:',a) # 当前日期: 2022-03-29 19:37:56.485323
2、datetime(2022, 3, 29, 19, 20)用指定日期时间创建时间
from datetime import datetime
#用指定日期创建
c=datetime(2022, 3, 29, 19, 20)
print('指定日期:',c) # 指定日期: 2022-03-29 19:20:00
3.datetime 时间差
import datetime
ctime = datetime.datetime.today()
time_tel = datetime.timedelta(days=4)
print(ctime) # 现在时间
print(ctime + time_tel) # 4天后时间
print(ctime - time_tel) # 4天前时间
res = ctime + time_tel
print(res - ctime) # 4 days, 0:00:00
4、字符串转换成 datetime 类型 或 将datetime转换成字符串
用strptime
用系统时间输出指定字符串
- 用
datetime.now()
六、random 模块
- 也称为随机数模块
1)随机小数
print(random.random()) # 随机产生一个0到1之间的小数
print(random.uniform(2,4)) # 随机产生一个2到4之间的小数
print(random.randint(0,9)) # 随机产生一个0到9之间的整数(包含0和9)
2)随机打乱一个数据集合
random.shuffle()
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
random.shuffle(l) # 随机打乱一个数据集合 类似于洗牌
print(l)
3)随机抽取一个(随机选择一个返回)
random.choice()
ll1 = ['特等奖','张飞抱回家','如花','百万现金大奖','群内配对']
print(random.choice(ll1)) # 随机抽取一个
4)随机指定个数抽取(抽样)
random.sample(表名, 个数)
ll = ['如花','C老师','R老师','J老师','M老师','张飞','龙龙']
print(random.sample(ll, 2)) # 随机指定个数抽样