主要用于加密和校验python
常见密文:md5,sha1,sha256,sha512正则表达式
最经常使用的是MD5(用于校验),平时加密时使用sha1app
'''加密 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:\s24\day17\python-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:\s24\day17\python-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
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.了解
正则:就是用一些具备特殊含义的符号组合到一块儿(称为正则表达式)来描述字符或者字符串的方法。正则就是用来描述一类事物的规则编码
元字符 | 匹配规则 |
---|---|
\w | 匹配字母(包含中文)或数字或下划线 |
\W | 匹配除字母(包含中文),数字或下划线 |
\s | 匹配任意的空白符 |
\S | 匹配任意的非空白符 |
\d | 匹配数字,等价于[0-9] |
\D | 匹配非数字 |
\A | 从字符串开头匹配 |
\Z | 匹配字符串结束,若是是换行,只匹配到换行前的结果 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
. | 匹配任意字符,除换行符,当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将括号内外一块儿输出 |
re.search():在字符串中搜索匹配正则表达式的第一个位置,并返回math对象,.group()查看对象。加密
re.match():从字符串的开始位置匹配正则表达式,并返回match对象code
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'))
import re #分割 s = 'aa#所谓结案,2123:lkj!无*所谓' print(re.split("[#,:!*]",s)) #替换 print(re.sub("所谓","me",s))
import re f = re.finditer("\w","你是垃圾") print(next(f).group()) for i in f: print(i)
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')
符号 | 匹配规则 | 贪婪规则 |
---|---|---|
*? | 前一个字符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))
m(? <名字> \w+)t group("名字") 对象
import re print(re.search("(?<ta_name>\w+)\w+",h1hellth).group("ta_name"))