内容概要
分组优先
在我们使用括号给正则表达式分组时会出现只展示括号里的表达式筛选的结果"以下只展示括号里筛选的结果" import re ret = re.findall('a(b)c', 'abcabcabcabc') 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') print(ret) # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')] ''' findall默认是分组优先展示 正则表达式中如果有括号分组 那么在展示匹配结果的时候 默认只演示括号内正则表达式匹配到的内容!!! '''
取消分组优先
当我们不想筛选结果分组优先展示时,可以用其他办法取消分组优先'''通过在括号里用(?:)来取消分组优先展示''' ret = re.findall('(?:a)bc', 'abcabcabcabc') print(ret) # ['abc', 'abc', 'abc', 'abc'] '''findall不能通过.group()分组'''
group括号内的值
# 一个分组 ret = re.search('ab(c)', 'abcabcabcabc') print(ret.group()) # abc print(ret.group(0)) # abc print(ret.group(1)) # b 可以通过索引的方式单独获取分组内匹配到的数据 # 有两个分组时 ret = re.search('a(b)(c)', 'abcabcabcabc') print(ret.group()) # abc print(ret.group(0)) # abc print(ret.group(1)) # b 可以通过索引的方式单独获取分组内匹配到的数据 print(ret.group(2)) # c 可以通过索引的方式单独获取分组内匹配到的数据 '''可以看出有几个分组group内的的值最大的数就多少,不写时默认为0'''
分组后起别名
'''这里得分组指的是能支持group的才可以如search match ; findall不行会报错''' # 分组起别名后可直接拿别名来使用 ret = re.search('a(?P<name1>b)(?P<name2>c)', 'abcabcabcabc') print(ret.group('name1')) # b print(ret.group('name2')) # c
具名元组namedtuple
# 具名元组顾名思义是具有名字的元组 """具名元组的使用场景也非常的广泛 比如数学领域、娱乐领域等""" from collections import namedtuple # 导入模块 # 产生一个元组对象模板 card = namedtuple('扑克牌', ['花色', '点数']) # 创建多个元组数据 c1 = card('黑桃♠', 'A') c2 = card('黑梅♣', 'K') c3 = card('红心❤', 'A') print(c1, c2, c3) print(c1.点数)
双端队列
''' 队列:默认先进先出一端进一端出 双端队列:两端都可以进出 ''' "队列" 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() # 左边弹出元素
字典相关
# 有序字典 from collections import OrderedDict d2 = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(d2) # OrderedDict([('a', 1), ('b', 2), ('c', 3)]) d2['e'] = 111 d2['b'] = 222 d2['c'] = 333 print(d2) # OrderedDict([('a', 1), ('b', 222), ('c', 333), ('e', 111)]) print(d2.keys()) # odict_keys(['a', 'b', 'c', 'e']) """字典的所有默认值都为列表 {'':[],'':[]}""" """ 有如下值集合 [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) # 字典所有的值默认都是列表 {'':[],'':[]} 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]})
计数器Counter
res = 'abcdeabcdabcaba' ''' 统计字符串中所有字符出现的次数 {'a':3,'b':5...} ''' # 自己写的方法 # 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')) # 可以当成字典使用
时间戳 timestamp
# 1.常用方法 1.time.sleep(secs) 推迟指定的时间运行,单位为秒 ps:该方法贯穿前后(基础、后期) 2.time.time() 获取当前时间戳 t = time.time() print(t) # 1648530221.6222584 '''时间戳 从1970年1月1日0时0分0秒至今的秒数'''
结构化时间 struct_time
# struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等) # 时间元组:localtime将一个时间戳转换为当前时区的struct_time tp = time.localtime() print(tp) # time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=12, tm_min=54, tm_sec=15, tm_wday=1, tm_yday=88, tm_isdst=0)
结构化时间符号信息表
元素符号 | 表示信息 | 元素符号 | 表示信息 |
---|---|---|---|
tm_year | (年) 比如2011 | tm_min | (分)0 - 59 |
tm_mon | (月)1 - 12 | tm_sec | (秒)0 - 60 |
tm_mday | (日) 1 - 31 | tm_wday | (weekday)0 - 6(0表示周一) |
tm_hour | (时)0 - 23 | tm_yday | (一年中的第几天)1 - 366 |
tm_isdst | (是否是夏令时)默认为0 |
格式化时间 Format String
# t1 = time.strftime('%Y-%m-%d %H:%M:%S') # 固定格式 t1 = time.strftime('%Y-%m-%d %X') # 简写 当后边的不记得时可以用%X print(t1) # 2022-03-29 13:03:41
格式化时间符号信息表
元素符号 | 表示信息 | 元素符号 | 表示信息 |
---|---|---|---|
%y | 两位数的年份表示(00-99) | %Y | 四位数的年份表示(000-9999) |
%m | 月份(01-12) | %M | 分钟数(00=59) |
%d | 月内中的一天(0-31) | %S | 秒(00-59) |
%H | 24小时制小时数(0-23) | %I | 12小时制小时数(01-12) |
%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 | 当前时区的名称 | %% | %号本身 |
时间类型转换
格式化时间 <==> 结构化时间 <==> 时间戳 # 时间戳<-->结构化时间 gmtime localtime # 结构化时间<-->格式化时间 strftime strptime time.strptime("2017-03-16","%Y-%m-%d") time.strptime("2017/03","%Y/%m") 前后必须一致 ps:UTC时间比我所在的区域时间早八个小时(时区划分)
# 基本操作 import datetime # print(datetime.date.today()) # 2022-03-29 # print(datetime.datetime.today()) # 2022-03-29 11:55:50.883392 """ date 意思就是年月日 datetime 意思就是年月日 时分秒 ps:后期很多时间相关的操作都是跟date和time有关系 """ # res = datetime.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 """时间差""" ctime = datetime.datetime.today() time_tel = datetime.timedelta(days=4) # 有很多时间选项 # print(ctime) # 2022-03-29 12:01:52.279025 # print(ctime + time_tel) # 2022-04-02 12:01:52.279025 # print(ctime - time_tel) # 2022-03-25 12:03:34.495813 """ 针对时间计算的公式 日期对象 = 日期对象 +/- timedelta对象 timedelta对象 = 日期对象 +/- 日期对象 """ res = ctime + time_tel print(res - ctime) # 4 days, 0:00:00
import random # 随机产生一个0到1之间的小数 print(random.random()) # 0.2791171516078955 # 随机产生一个2到4之间的小数 print(random.uniform(2,4)) # 3.462177394295104 # 随机产生一个0到9之间的整数(包含0和9) print(random.randint(0,9)) # 5 # 掷骰子 print(random.randint(1,6)) # 3 # 随机打乱顺序 洗牌 l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] random.shuffle(l) # 随机打乱一个数据集合 print(l) # [8, 9, 6, 10, 1, 7, 3, 2, 5, 4] # 抽奖 l1 = ['一等奖', '二等奖', '三等奖', '谢谢惠顾'] # 随机抽取一个 print(random.choice(l1)) # 谢谢惠顾 # 随机抽取指定个数 print(random.sample(l1,3)) # ['二等奖', '三等奖', '谢谢惠顾']