zoukankan      html  css  js  c++  java
  • python模块知识三 hashlib 加密模块、collections、re模块

    8.hashlib 加密模块

    ​ 主要用于加密和校验

    常见密文:md5,sha1,sha256,sha512

    1. 只要明文相同,密文就相同
    2. 只要明文不相同,密文就是不相同的
    3. 不能反逆(不能解密)--md5中国破解了

    最常用的是MD5(用于校验),平时加密时使用sha1

    '''加密
    	1.指定要加密的方式
        2.将要加密的内容转成字节
        3.合成
    '''
    import hashlib
    md5 = hashlib.md5()#1
    md5 = hashlib.sha1()
    md5 = hashlib.sha256()
    md5 = hashlib.sha512()
    
    md5.update("alex123".encode("utf-8"))#2  密文与编码方式无关,只与加密方式和明文有关
    print(md5.hexdigest())#3
    

    加盐:

    #1.固定加盐
    import hashlib
    pwd = "wang123"
    md5 = hashlib.md5("我去".encode("utf-8"))
    md5 = hashlib.md5(b"alex07yu")
    md5.update(pwd.encode("utf-8"))
    print(md5.hexdigest())
    
    
    #2.动态加盐
    user = input("username:")
    pwd = input("passwd:")
    md5 = hashlib.md5(user.encode("utf-8"))
    md5.update(pwd.encode("utf-8"))
    print(md5.hexigest())
    
    #3.读取文件内容加密
    f = open(r"F:s24day17python-3.6.6-amd64.exe",'rb')
    md5 = hashlib.md5()
    md5.update(f.read())
    print(md5.hexdigest())
    
    #4.逐步加密和一次加密结果一样
    import hashlib
    pwd1 = 'a'
    pwd2 = 'b'
    pwd3 = 'ab'
    md5 = hashlib.md5()
    md5.update(pwd1.encode("utf-8"))
    md5.update(pwd2.encode("utf-8"))
    print(md5.hexdigest())
    md6 = hashlib.md5()
    md6.update(pwd3.encode("utf-8"))
    
    #5.接3,当文件太大时,逐步加密,节省内存
    import hashlib
    f = open(f"F:s24day17python-3.6.6-amd64.exe",'rb')
    md5 = hashlib.md5()
    while 1:
        msg = f.read(1024)#每次读取1024字节
        if msg:
            md5.update(msg)
        else:
            print(md5.hexdigest())
            break
    

    9.collections

    1. namedtuple :命名元组。生成可以使用的名字来访问元素内容的tuple
    2. deque:双端队列,可以快速地从另一侧追加和删除对象
    3. Counter:计数器,用来计算重复的元素个数
    4. defaultdict:带有默认值的字典
    5. OrdereDict
    from collections import namedtuple
    #1.
    point = namedtuple('a',['x','y'])
    p = point(1,2)
    print(p)
    #2.
    from collections import deque
    lst1 = depue([1,2,3,4,5])
    lst1.append(8)
    lst1.appendleft(0)
    lst1.pop()
    lst1.popleft()
    print(lst1[4])
    #3.***
    from collections import Counter
    s1 = '13215af13213a1dfa3sdfa3'
    print(dict(Count(s1)))
    s2 = [1,1,2,2,3,3]
    print(dict(Count(s2)))
    s3 = (1,2,3,3,4,5,6,7,78)
    print(dict(Count(s3)))
    #4.
    from collections import defaultdict
    dic = defaultdict(list)
    dic['k1'].append(1)
    print(dic)
    #结果:defaultdict(<class 'list'>, {'k1': [1]})
    '''
    将列表中大于66的放到k1中,其余的放到k2中,用带有默认值的字典模块做
    '''
    li = [11,22,33,44,55,77,88,99,90]
    from collections import defaultdict
    dic = defaultdict(set)
    for i in li:
        if i > 60:
            dic['k1'].add(i)
        else:
            dic['k2'].add(i)
    print(dic)
    #5.了解
    

    10.re模块

    正则:就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。正则就是用来描述一类事物的规则

    元字符 匹配规则
    w 匹配字母(包含中文)或数字或下划线
    W 匹配除字母(包含中文),数字或下划线
    s 匹配任意的空白符
    S 匹配任意的非空白符
    d 匹配数字,等价于[0-9]
    D 匹配非数字
    A 从字符串开头匹配
     匹配字符串结束,如果是换行,只匹配到换行前的结果
    匹配一个换行符
    匹配一个制表符
    ^ 匹配字符串的开始
    $ 匹配字符串的结尾
    . 匹配任意字符,除换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
    [] 匹配字符组中的字符,[abc]表示a,b,c。[a-z]表示a到z单个字符,'-'不会匹配到,当放到开头才会匹配--> [-a-z]
    [^] 匹配除了字符组中的字符外的所有字符,[^abc]表示非a或者b或者c的单个字符
    * 前一个字符0次或无限次扩展,abc* 表示 ab、abc、abcc、abccc……
    + 前一个字符1次或无限次扩展,
    前一个字符0次或一次扩展
    {n} 扩展前一个字符n次,ab{2}c表示abbc
    {m,n} 匹配扩展前一个字符扩展m到n次,含n次,贪婪匹配
    | 左右任意表达一个,a|b匹配a或b
    () 匹配括号内的表达式,表示一个组,括号内可用|,(abc|def)表示abc或def。m(?:)t将括号内外一起输出
    1.方法
    1. re.search():在字符串中搜索匹配正则表达式的第一个位置,并返回math对象,.group()查看对象。

    2. re.match():从字符串的开始位置匹配正则表达式,并返回match对象

      match对象没有匹配到就返回None

    import re
    #search找到第一个就停止查找
    print(re.search(r'[1-9]d{3}','100086'))
    print(re.search(r'[1-9]d{3}','00086001500012').group())
    #match只从开头找,开头不符合就不查找了
    print(re.search(r'[1-9]d{3}','100086'))
    print(re.match(r'[1-9]d{3}','00086002154'))
    
    1. re.findall():搜索字符串,以列表的类型返回全部等匹配的子串
    2. re.split():将一个字符串按照正则表达式匹配的结果进行分割,返回列表
    3. re.sub():在一个字符串中替代所有匹配的正则表达式的子串,返回替代后的字符串
    import re
    #分割
    s = 'aa#所谓结案,2123:lkj!无*所谓'
    print(re.split("[#,:!*]",s))
    
    #替换
    print(re.sub("所谓","me",s))
    
    
    1. re.finditer():返回的是一个迭代器地址
    import re
    f = re.finditer("w","你是垃圾")
    print(next(f).group())
    
    for i in f:
        print(i)
    
    2.re的两种等价方法:
    1. 函数式用法:一次性操作
    2. 面向对象用法:编译后可对此操作,re.compile()-->定义匹配规则
    import
    #1.函数式用法:
    rst = re.search(r'[1-9]d{5}','BIT 100086')
    print(rst.group())
    #2.面向对象:
    pat = re.compile(r'[1-9]d{5}')
    rst = pst.serch('BIT 100086')
    
    3.正则的贪婪匹配和最小匹配(默认为贪婪匹配)
    符号 匹配规则 贪婪规则
    *? 前一个字符0或无限次扩展 最小匹配
    +? 1或 最小匹配
    ?? 0或1 最小匹配
    {m,n} 扩展前一个字符m-n次含n 贪婪匹配
    import re
    #贪婪匹配
    match = re.search(r'py.*n','pyanbncndn')
    print(match.group(0))
    #最小匹配加'?'
    match = re.search(r'py.*?n','pyanbncndn')
    print(match.group(0))
    
    4.起名字

    m(?<名字>w+)t group("名字")

    import re
    print(re.search("(?<ta_name>w+)w+",h1hellth).group("ta_name"))
    

  • 相关阅读:
    stark
    MySQL与JDBC
    存储过程/视图/触发器
    MyCat部署运行(Windows环境)与使用步骤详解
    常用单词总结
    表单校验---validation检验
    jQuery简介
    javascript简单介绍
    HTML&&CSS
    消息队列Java的简单实现
  • 原文地址:https://www.cnblogs.com/Onlywang/p/11285672.html
Copyright © 2011-2022 走看看