Python D20 Python模块之re,collections,time,datetime

 

python内置模块之re模块

# 在python要想使用正则必须借助于模块 re就是其中之一
 

findall 方法

import re

# re.findall('正则表达式','带匹配的文本')  # 根据正则匹配除所有符合条件的数据
# res = re.findall('b','eva jason jackson')
# print(res)  # ['a', 'a', 'a']  结果是一个列表(要么有元素 要么空列表)

search方法

import re
# res = re.search('正则表达式','带匹配的文本')  # 根据正则匹配到一个符合条件的就结束
# res = re.search('a','eva jason jackson')
# print(res)  # 结果对象
# print(res.group())  # 正在的结果
# if res:
#     print(res.group())
# else:
#     print('不好意思 没有找到')
"""如果没有符合条件的数据 那么search返回None 并且使用group会直接报错"""

match 方法

import re
res = re.match('a','abac')  # 根据正则从头开始匹配(文本内容必须在开头匹配上)
print(res)
print(res.group())
# if res:
#     print(res.group())
# else:
#     print('不好意思 没有找到')
"""如果没有符合条件的数据 那么match返回None 并且使用group会直接报错"""

split 方法

import re
# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
# res = re.split('[ab]','abcd')
# print(res)  # ['', '', 'cd']

sub 方法

import re
# 类似于字符串类型的replace方法
# res = re.sub('\d','H','eva3jason4yuan4',1)  # 替换正则匹配到的内容
# res = re.sub('\d','H','eva3jason4yuan4')  # 不写默认替换所有
# print(res)  # evaHjason4yuan4

subn 方法

import re
"""返回元组 并提示替换了几处"""
# res = re.subn('\d','H','eva3jason4yuan4',1)
# print(res)  # ('evaHjason4yuan4', 1)
# res = re.subn('\d','H','eva3jason4yuan4')
# print(res)  # ('evaHjasonHyuanH', 3)

常用方法的其他应用

import re
"""常用"""
# regexp_obj = re.compile('\d+')
# res = regexp_obj.search('absd213j1hjj213jk')
# res1 = regexp_obj.match('123hhkj2h1j3123')
# res2 = regexp_obj.findall('1213k1j2jhj21j3123hh')
# print(res,res1,res2)

"""常用"""
# res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131')
# print([i.group() for i in res])

# res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
# print(res)
# print(res.group())  # 110105199812067023
# print(res.group(1))  # 10105199812067
# print(res.group(2))  # 023


'''常用'''
# findall针对分组优先展示   无名分组
# res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')
# print(res)  # ['023']
# 取消分组优先展示          无名分组
# res1 = re.findall("^[1-9](?:\d{14})(?:\d{2}[0-9x])?$",'110105199812067023')
# print(res1)

# 有名分组
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
print(res)
print(res.group())  # 110105199812067023
print(res.group(1))  # 10105199812067  无名分组的取值方式(索引取)
print(res.group('xxx'))  # 10105199812067
print(res.group('ooo'))  # 023

正则实战案例之爬取红牛中国分公司信息

import re

# 读取带匹配的数据
with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()
# 利用正则匹配数据
# 分公司名称
title_list = re.findall('<h2>(.*?)</h2>', data)
# print(title_list)
# 分公司地址
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(address_list)
# 分公司邮箱
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(email_list)
# 分公司电话
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)

res = zip(title_list, address_list, email_list, phone_list)
for data_tuple in res:
    print("""
    公司名称:%s
    公司地址:%s
    公司邮箱:%s
    公司电话:%s
    """ % (data_tuple[0], data_tuple[1], data_tuple[2], data_tuple[3]))


 

collections模块

# 该模块内部提供了一些高阶的数据类型

1.namedtuple(具名元组)

from collections import namedtuple

    """
    namedtuple('名称',[名字1,名字2,...])
    namedtuple('名称','名字1 名字2 ...')
    """
    # point = namedtuple('坐标', ['x', 'y'])
    # res = point(11, 22)
    # print(res)  # 坐标(x=11, y=22)
    # print(res.x)  # 11
    # print(res.y)  # 22
    # point = namedtuple('坐标', 'x y z')
    # res = point(11, 22, 33)
    # print(res)  # 坐标(x=11, y=22, z=33)
    # print(res.x)  # 11
    # print(res.y)  # 22
    # print(res.z)  # 33
    # card = namedtuple('扑克', '花色 点数')
    # card1 = card('♠', 'A')
    # card2 = card('♥', 'K')
    # print(card1)
    # print(card1.花色)
    # print(card1.点数)

 

2.队列
 

# 队列模块
    import queue  # 内置队列模块:FIFO
    # 初始化队列
    # q = queue.Queue()
    # 往队列中添加元素
    # q.put('first')
    # q.put('second')
    # q.put('third')
    # 从队列中获取元素
    # print(q.get())
    # print(q.get())
    # print(q.get())
    # print(q.get())  # 值去没了就会原地等待

 3.双端队列

from collections import deque
    q = deque([11,22,33])
    q.append(44)  # 从右边添加
    q.appendleft(55)  # 从左边添加
    print(q.pop())  # 从右边取值
    print(q.popleft())  # 从做边取值

4.有序字典

 normal_dict = dict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
    print(normal_dict)
    {'hobby': 'study', 'pwd': 123, 'name': 'jason'}
    from collections import OrderedDict
    order_dict = OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
    print(order_dict)
    OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
    order_dict['xxx'] = 111
    order_dict
    OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study'), ('xxx', 111)])
    normal_dict['yyy'] = 222
    normal_dict
    {'hobby': 'study', 'pwd': 123, 'yyy': 222, 'name': 'jason'}

5.默认值字典

from collections import defaultdict
    values = [11, 22, 33,44,55,66,77,88,99,90]
    my_dict = defaultdict(list)
    for value in  values:
        if value>60:
            my_dict['k1'].append(value)
        else:
            my_dict['k2'].append(value)
    print(my_dict)

6.计数器

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)
    from collections import Counter  # 计数器
    ret = Counter(res)
    print(ret)

 

time模块

"""
时间三种表现形式


     1.时间戳(秒数)
     2.结构化时间(一般是给机器看的)
     3.格式化时间(一般是给人看的)
     

三种时间是可以相互转换的!!!


"""
1.time.sleep()     # 原地阻塞指定的秒数
2.time.time()       # 获取时间戳时间

import time


# 格式化时间
# print(time.strftime('%Y-%m-%d'))  # 2021-11-25
# print(time.strftime('%Y-%m-%d %H:%M:%S'))  # 2021-11-25 11:48:34
# print(time.strftime('%Y-%m-%d %X'))  # 2021-11-25 11:48:34
"""
更多时间相关符号 保存到容易查找的位置即可
"""
# print(time.localtime())
# time.struct_time(
# tm_year=2021,
# tm_mon=11,
# tm_mday=25,
# tm_hour=11,
# tm_min=51,
# tm_sec=25,
# tm_wday=3,
# tm_yday=329,
# tm_isdst=0)


# print(time.time())
print(time.gmtime(11111111111))
# print(time.localtime())

 


datatime

import datetime
 print(datetime.date.today())  # 2021-11-25
 print(datetime.datetime.today())  # 2021-11-25 12:15:11.969769

"""date年月日  datetime年月日时分秒  time时分秒(MySQL django后期可以)"""
 res = datetime.datetime.today()
 print(res.year)  # 2021
 print(res.month)  # 11
 print(res.day)  # 25
 print(res.weekday())  # 获取星期(weekday星期是0-6) 0表示周一
 print(res.isoweekday())  # 获取星期(weekday星期是1-7) 1表示周一



"""时间差(timedelta)"""
# ctime = datetime.datetime.today()
# time_tel = datetime.timedelta(days=3)
# print(ctime)  # 2021-11-25 12:20:48.570489
# print(ctime - time_tel)  # 2021-11-22 12:21:06.712396
# print(ctime + time_tel)  # 2021-11-28 12:21:06.712396


"""
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
"""
 ret = ctime + time_tel
 print(ret - ctime)  # 3 days, 0:00:00
 print(ctime - ret)  # -3 days, 0:00:00

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
国密(SM2、SM3、SM4)是中国自主研发的密码算法标准。以下是一个使用Python进行国密加密解密的示例代码: 首先,需要安装`gmssl`库,它提供了国密算法的实现。你可以使用以下命令来安装它: ``` pip install gmssl ``` 接下来,我们将给出一个使用SM2进行加密解密的示例代码: ```python from gmssl import sm2, func # 生成SM2密钥对 private_key = '7B8D92E5C6C8B0F9A2CFD2E3E4E6E8EA9FA4A7A9BDC0D3D6D9DCDEE1E4E7EA' public_key = '04A7F4427940CFF9AFFF07FCFF8414D20B186C9F94A181E16AD7F6A26F320BCE4C8C22CDB8ACF5EE5AA42F9C7CE6A6BA31D1D32B8F3A9A60A489C8972FCA5C0E' # 加密 def encrypt(message): sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key) enc_data = sm2_crypt.encrypt(message.encode()) return enc_data.hex() # 解密 def decrypt(encrypted_data): sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key) dec_data = sm2_crypt.decrypt(bytes.fromhex(encrypted_data)) return dec_data.decode() # 测试加密解密 message = 'Hello, World!' encrypted_message = encrypt(message) decrypted_message = decrypt(encrypted_message) print('加密后的消息:', encrypted_message) print('解密后的消息:', decrypted_message) ``` 在上面的代码中,我们首先生成了一个SM2密钥对,然后定义了`encrypt`和`decrypt`函数来进行加密和解密。`encrypt`函数使用公钥对消息进行加密,返回加密后的十六进制字符串。`decrypt`函数使用私钥对加密数据进行解密,返回解密后的原始消息。 请注意,示例代码中使用的密钥对是固定的,你可能需要根据实际情况替换为自己的密钥对。 希望这能帮助到你!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值