Python基础篇---re模块补充,collections,time,datetime和random模块
本章内容
• re模块补充
• collections模块
• queue模块
• time模块
• datetime模块
• random模块
re模块补充
findall的分组优先
findall方法默认是分组优先展示的。正则表达式中如果有括号分组,那么在展示匹配结果的时候,默认只演示括号内正则表达式匹配到的内容。
取消分组优先展示的机制,使用(?:) 括号前面加问号冒号即可取消。
import re ret = re.findall('a(b)c', 'abcabcabcabc') # 优先展示b print(ret) # ['b', 'b', 'b', 'b'] ret = re.findall('a(?:b)c', 'abcabcabcabc') # 取消优先展示 print(ret) # ['abc', 'abc', 'abc', 'abc'] ret = re.findall('(a)(b)(c)', 'abcabcabcabc') # 优先展示a b c 分组 print(ret) # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
search也有分组的功能,还可以起别名
search可以用group()通过索引的方式单独获取分组内匹配到的数据。
需要注意的是当索引值位0的时候输出内容与不加参数一致,search可以通过(?P<name>b)的方式给分组起名。
import re ret = re.search('a(b)c', 'abcabcabcabc') print(ret.group()) # abc print(ret.group(0)) # abc 0是默认值,输出内容与不加参数一致 print(ret.group(1)) # b 可以通过索引的方式单独获取分组内匹配到的数据 ret = re.search('a(b)(c)', 'abcabcabcabc') print(ret.group()) # abc print(ret.group(0)) # abc 0是默认值,输出内容与不加参数一致 print(ret.group(1)) # b 可以通过索引的方式单独获取分组内匹配到的数据 print(ret.group(2)) # c 可以通过索引的方式单独获取分组内匹配到的数据 '''针对search和match有几个分组 group方法括号内最大就可以写几''' # 分组之后还可以给组起别名 ret = re.search('a(?P<name1>b)(?P<name2>c)', 'abcabcabcabc') print(ret.group('name1')) # b print(ret.group('name2')) # c
collections模块
collections模块为我们提供了更多的数据类型。
1.namedtuple(),具名元组
from collections import namedtuple # 1.先产生一个元组对象模板 point = namedtuple('坐标',['x','y']) # 2.创建诸多元组数据 p1 = point(4,2) p2 = point(19,1) print(p1,p2) # 坐标(x=4, y=2) 坐标(x=19, y=1) print(p1.x) # 4 print(p1.y) # 2 person = namedtuple('学生','name age') p1 = person('jason',18) p2 = person('tom',28) print(p1,p2) # 学生(name='jason', age=18) 学生(name='kevin', age=28) print(p1.name,p1.age) # jason 18
2.deque(),双端队列
import queue q = queue.Queue(3) # 最大只能放三个元素 # 存放元素 q.put(123) q.put(321) q.put(222) q.put(444) # 如果队列满了 继续添加则原地等待 # 获取元素 print(q.get()) # 123 print(q.get()) # 321 print(q.get()) # 222 print(q.get()) # 如果队列空了 继续获取则原地等待
# 双端队列:两端都可以进出 from collections import deque q = deque([1, 2, 3]) print(q) q.append(444) # 右边添加元素 print(q) q.appendleft(666) # 左边添加元素 print(q) q.pop() # 右边弹出元素 q.popleft() # 左边弹出元素
3.OrderedDict(),有序字典
# 无序字典 d1 = dict([('name','jason'),('pwd',123),('hobby','study')]) print(d1) # {'pwd': 123, 'name': 'jason', 'hobby': 'study'} print(d1.keys()) # 有序字典 from collections import OrderedDict d2 = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(d2) d2['x'] = 111 # 给d2传键值对 d2['y'] = 222 d2['z'] = 333 print(d2) print(d2.keys())
# 方法一 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) # {'k1': [67, 77, 88, 99, 999], 'k2': [11, 22, 33, 44, 55]} # 方法二 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) print(my_dict) # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [67, 77, 88, 99, 90]})
4.Counter(),计数器
res = 'abzabadasdzxcabasdzcz' ''' 统计字符串中所有字符出现的次数并以字典的方式存储 ''' # 方法1 for循环 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': 6, 'b': 3, 'z': 4, 'd': 3, 's': 2, 'x': 1, 'c': 2} # 方法2 counter计数 from collections import Counter r = Counter(res) print(r) # Counter({'a': 6, 'z': 4, 'b': 3, 'd': 3, 's': 2, 'c': 2, 'x': 1}) print(r.get('a')) # 6 可以当成字典使用
queue模块
# 生成队列 import queue q = queue.Queue(3) # 最大只能放三个元素 # 存放元素 q.put(123) q.put(321) q.put(222) q.put(444) # 如果队列满了 继续添加则原地等待 # 获取元素 print(q.get()) # 123 print(q.get()) # 321 print(q.get()) # 222 print(q.get()) # 如果队列空了 继续获取则原地等待
time模块
常用方法
time.sleep(secs)
推迟指定的时间运行,单位为秒
ps:该方法贯穿前后(基础、后期)
time.time()
获取当前时间戳
time有三种用于表示时间的格式,且彼此中间可以转换。
1.时间戳
距离1970年1月1日0时0分0秒至此相差的秒数 time.time()
2.结构化时间
该时间类型主要是给计算机看的,人看起来不太方便 time.localtime() localtime([seconds]) ->(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
| 索引 | 属性 | 值 |
| 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 - 6(0表示周一) |
| 7 | tm_yday(一年中的第几天) | 1 - 366 |
| 8 | tm_isdst(是否是夏令时) | 默认为0 |
3.格式化时间
人最容易接收的一种时间格式 2000/1/21 11:11:11
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2022-03-29 20:59:26
print(time.strftime('%Y-%m-%d %X')) # 2022-03-29 20:59:26
| 符合 | 说明 |
| %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 | 当前时区的名称 |
| %% | %号本身 |
PS:记住一些常用的即可 其他的全部记录到自己的博客 以后能找到就行!!!
时间类型的转换

datetime模块
基本操作
import datetime # 导入模块 print(datetime.date.today()) # 2022-03-29 date 年月日 print(datetime.datetime.today()) # 2022-03-29 21:16:47.838761 datetime 年月日 时分秒 atetime.date.today() print(res.year) # 2022 print(res.month) # 3 print(res.day) # 29 print(res.weekday()) # 1 星期0-6 print(res.isoweekday()) # 2 星期1-7
时间差
import datetime ctime = datetime.datetime.today() time_tel = datetime.timedelta(hours=1.5) # days,seconds,microseconds,milliseconds,minutes,hours,weeks print(ctime) # 2022-03-29 21:21:40.288855 print(ctime + time_tel) # 2022-03-29 22:51:40.288855 print(ctime - time_tel) # 2022-03-29 19:51:40.288855 """ 针对时间计算的公式 日期对象 = 日期对象 +/- timedelta对象 timedelta对象 = 日期对象 +/- 日期对象 """

random模块又称随机数模块,主要作用就是用来生成随机数。
1.random()---随机产生一个0到1中间的小数
import random print(random.random()) # 0.33088255948984235
2.uniform()---在一个前闭后开的区间随机产生一个小数
import random print(random.uniform(2,5)) # 3.4393133327976524
3.randint()---在一个区间里产生一个整数(两边都包含)
import random print(random.randint(2,5)) # 5
4.shuffle()---随机打乱一个数据集合
import random l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] random.shuffle(l) print(l) # [7, 10, 1, 5, 8, 13, 12, 3, 4, 2, 9, 11, 6]
5.choice()---随机抽取一个数据
import random l = ['一等奖','二等奖','三等奖','安慰奖','特等奖'] print(random.choice(l)) # 一等奖
6.sample()---随机指定个数抽样
import random l = ['一等奖','二等奖','三等奖','安慰奖','特等奖'] print(random.sample(l,2)) # ['特等奖', '三等奖']
作业
使用random模块编写一个能够产生随机验证码的代码
import random my_list=[] my_list.extend(chr(i) for i in range(97,123)) my_list.extend(str(i) for i in range(10)) my_list.extend(chr(i) for i in range(65,91)) # 方法1 sample def my_random(num): res=random.sample(my_list,num) # 随机抽样的个数 res2='' for i in res: res2 += i print('验证码为:'+res2) my_random(5) # 方法2 choice def my_random(num): res = '' for i in range(num): res += random.choice(my_list) print('验证码为:'+res) my_random(5)



浙公网安备 33010602011771号