主要用於加密和校驗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"))