re模块 collections模块 time与datetime模块 random模块

内容概要

  • re模块补充说明

  • 正则起别名及分组机制

  • collection模块

  • time与datetime模块

  • random随机数模块

内容详细

re模块补充说明

# 案例:
import re
1.# findall 方法补充:加括号优先展示
# 1.res = re.findall('a(b)c','abcabcabcabc')
#   print(res)   # ['b', 'b', 'b', 'b']   # 在正则表达式中给某个元素添加一个括号 分组优先展示
# 2.res = re.findall('a(?:b)c','abcabcabcabc')
#   print(res)  # ['abc', 'abc', 'abc', 'abc']  # 如何取消分组优先展示 ——可以使用?:
# 3.res =re.findall('(a)(b)(c)','abcabcabcabc')
#   print(res)   # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
# 在findall默认是分组优先展示
    # 大白话:正则表达式中如果有括号分组 那么在展示匹配结果的时候:默认会优先展示括号内正则表达式匹配的内容 如例题1.
    #        也可以取消分组优先展示的机制 通过(?:)  就是在括号前面加问号冒号
    
2.# search 方法补充:可以通过索引单独分配数据 大白话:分组特定取值
# res =re.search('(a)(b)c','abcabcabcabc')
# print(res.group())   # abc
# print(res.group(0))   # abc
# print(res.group(1))   # a
# print(res.group(2))   # b    # 如果是在search中可以加括号分组然后通过索引的方式单独获取匹配到的数据 也是遵循search的方法 只取到一个就结束
# 需要注意的是:针对search和match有几个分组 group方法括号内最大就可以写数值几

# 分组之后还可以给组起别名  通过?p<>的形式 然后可以通过别名直接找我们所需要的数据
#例题:res =re.search('a(?P<name1>b)(?P<name2>c)','abcabcabcabc')
# print(res.group('name1'))   # b
# print(res.group('name2'))   # c


collections模块

"在内置数据类型(dict list set tuple)的基础上 collections模块还提供了几个额外的数据类型:counter、deque、defaultdict、namedtuple"
1.# 具名元组 namedtuple
from collections import namedtuple
# 用法1.先产生一个元组对象模板
# res = namedtuple('坐标',['x','y'])
# # 2.创建诸多元数据
# p1 =res(1,2)
# p2 =res(3,4)
# print(p1,p2)  # 坐标(x=1, y=2) 坐标(x=3, y=4) 形成了一个二维坐标
# # 还可以用来取值
# print(p1.x)  # 1
# print(p2.y)  # 4
# 用法2 可以产生多维空间的用法
person =namedtuple('人物','name age gender')
p1 =person('jason',18,'male')
p2 =person('jerry',18,'female')
print(p1,p2) #人物(name='jason', age=18, gender='male') 人物(name='jerry', age=18, gender='female')
# 也可以用来取值
print(p1.name,p1.gender) # jason male
"具名元组的使用场景也非常广泛 比如数学领域、娱乐领域等"
比如:
card = namedtuple('扑克牌', ['花色', '点数'])
c1 = card('黑桃♠', 'A')
c2 = card('黑梅♣', 'K')
c3 = card('红心❤', 'A')
print(c1, c2, c3)
print(c1.点数)

2.# 双端队列
队列:先进先出  默认是只有一端只能进另外一端只能出
双端队列:两端都可以进出
# 1.import queue   # 队列
# q =queue.Queue(3)  # 表示的是对列只能放三个元素
# # 存放元素
# q.put(123)
# q.put(231)
# q.put(321)
# # q.put(444)  # 如果对列满了 继续添加元素则原地等待
# # 获取元素
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())  # 如果队列空了 继续获取则需要原地等待

# 2.deque 双端队列
from collections import deque
q =deque([1,2,3])
# print(q)  # deque([1, 2, 3])
q.append(444)  # 双端队列可以右边添加元素
print(q)  # deque([1, 2, 3, 444])
q.appendleft(666) # 也可以左边添加元素
print(q)  # deque([666, 1, 2, 3, 444])
q.pop()  # 可以尾部右侧弹出元素
print(q)   # deque([666, 1, 2, 3])
q.popleft()  # 也可以左边弹出元素
print(q)  # deque([1, 2, 3])

3.字典相关
# 我们都知道正常的字典内部都是无序的
# 无序的字典
d1 =dict([('name','jason'),('pwd',123),('hobby','study')])
print(d1) # {'name': 'jason', 'pwd': 123, 'hobby': 'study'}
print(d1.keys()) # dict_keys(['name', 'pwd', 'hobby'])
# 有序的字典  OrderedDict
from collections import OrderedDict
d2 =OrderedDict([('a',1),('b',2),('c',3)])
print(d2)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
d2['x'] = 111
d2['y'] = 222
d2['z'] = 333
print(d2)  # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('x', 111), ('y', 222), ('z', 333)])
print(d2.keys())  # odict_keys(['a', 'b', 'c', 'x', 'y', 'z'])

有序字典的应用:
有如下值集合 [11,22,33,44,55,67,77,88,99,999],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
"""
# l1 = [11,22,33,44,55,67,77,88,99,999]
# new_dict = {'k1':[],'k2':[]}
# for i in l1:
#     if i > 66:
#         new_dict['k1'].append(i)
#     else:
#         new_dict['k2'].append(i)
# print(new_dict)
from collections import defaultdict
values = [11, 22, 33,44,55,67,77,88,99,90]
my_dict = defaultdict(list)  # 字典所有的值默认都是列表  {'':[],'':[]}
for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)

4.计数器
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}
# 用counter如何来书写
from collections import Counter
r =Counter(res)
print(r)  #Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
print(r.get('a'))  # 5
# 此外 我们还可以将统计次数的功能当成字典使用

     

time 模块

# 1.采用方法
1.time.sleep(secs)
   推迟指定的时间运行,单位为秒
   注意:该方法贯穿前后(基础、后期)
2.time.time()
   获取当前时间戳
    
# 2.三种用于表示时间的格式(彼此之间可以转换)
1.时间戳
  距离197011000秒至此相差的秒数
     time.time()
2.结构化时间
  该时间类型主要是给计算机看的,人看起来不太方便
    time.localtime()
    0 tm_year()  比如2011
    1	tm_mon(月)	1 - 12
    2	tm_mday(日)	1 - 31
    3	tm_hour(时)	0 - 23
    4	tm_min(分)	0 - 59
    5	tm_sec(秒)	0 - 60
    6	tm_wday(weekday)	0 - 60表示周一)
    7	tm_yday(一年中的第几天)	1 - 366
    8	tm_isdst(是否是夏令时)	默认为0
3.格式化时间
  人最容易接收的一种时间格式 
    # 结构化时间
import time
print(time.localtime()) # # 2022-03-29 17:17:40
time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=17, tm_min=11, tm_sec=33, tm_wday=1, tm_yday=88, tm_isdst=0)

# 格式化时间
print(time.strftime('%Y-%m-%d %H:%M:%S'))  # 2022-03-29 17:17:40
print(time.strftime('%Y-%m-%d %X'))  # 2022-03-29 17:17:40

三种时间类型的转换

格式化时间 <==> 结构化时间 <==> 时间戳

# 时间戳<==> 结构化时间
     gmtime
    localtime
# 结构化时间<-->格式化时间
    strftime
    strptime
    time.strptime("2017-03-16","%Y-%m-%d")
    time.strptime("2017/03","%Y/%m")   括号内前后数字与英文必须保持一致 包括格式 年月等

datetime模块(更加高效)

# 基本操作
import datetime
# print(datetime.date.today())  # 2022-03-29
# print(datetime.datetime.today()) # 2022-03-29 18:06:30.300979 注意一个是有时分秒

date  表示是年月日
datetime  表示是年月日 时分秒
注意:后期很多时间相关的操作都是跟date和time有关系

例题:
# res =datetime.date.today()
# print(res.year)  # 2022
# print(res.month)   # 3
# print(res.day)    # 29
# print(res.weekday)  # 1  weekday是星期一到星期天是从数字0到数字6
# print(res.isoweekday())  # 2  isoweekday是星期一到星期天是从数字1到数字7

"时间差应用"
ctime =datetime.datetime.today()
time_tel =datetime.timedelta(days=4)  # 时间差为4天
print(ctime)  # 2022-03-29 18:18:29.296103
print(ctime+time_tel)  # 2022-04-02 18:20:08.519779 # 加可以定时定在4天后
print(ctime-time_tel)  #  减可以定时定在4天前 2022-03-25 18:21:51.654678

针对时间计算的公式
     日期对象 =日期对象 +/- timedalta对象
    timedelta对象 =日期对象 +/-日期对象
# 可以计算两个时间的时间差值    
res =ctime +time_tel
print(res-ctime)   # 4 days,0:00:00  

random 模块

'''别名>>>:随机数模块'''
import random

# print(random.random())  # 没有数字默认随机产生一个0到1之间的小数
print(random.uniform(2,4))  # 随机产生一个2到4之间的小数
# print(random.randint(0,9))  # 随机产生一个0到9之间的整数(包含0和9)
应用:
print(random.randint(1,6))  # 摇骰子
# l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
# random.shuffle(l)  # 随机打乱一个数据集合                       洗牌
# print(l)
# ll1 = ['特等奖','张飞抱回家','如花','百万现金大奖','群内配对']
# print(random.choice(ll1))  # 随机抽取一个                     抽奖
ll = ['如花','C老师','R老师','J老师','M老师','张飞','龙龙']
print(random.sample(ll, 2))  # 随机指定个数抽样                 抽样
posted @   一颗平凡的小石头  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示