day 16
一、正则表达式(re模块)
1、常用的匹配符号
#import re w :匹配字母数字和下划线 # print(re.findall("w","naj_%^*(%jn")) # print(re.findall("ww","naj_%^*(%jn")) W:匹配除了字母数字和下划线的其他字符 s:匹配空的字符包含空格 换行符 等看不见的 S:取反s ^: 仅从头开始匹配 # print(re.findall('^alex',' alex is alex is alex')) $: 仅从尾部开始匹配 # print(re.findall('alex$',' alex is alex is alex1')) d:匹配数字 D:匹配费数字字符 #重复匹配 . 匹配除了换行符以外的任意字符 # print(re.findall("a.c","a9c a*c a c")) # print(re.findall("a.c","a9c a*c a c",re.DOTALL)) #这样就可以匹配包含换行符以外的任意字符了 [] 表示匹配中括弧内指定的任意一个字符 # print(re.findall("a[0-9]c","a9c a7c")) # print(re.findall("a[-+*/]c","a-c a^c")) ?:代表左边的字符重复0次或1次 # print(re.findall("ab?","a ab abb abbb abbbbb")) # result:['a', 'ab', 'ab', 'ab', 'ab'] *:代表左边的字符重复0次到无穷次次 # print(re.findall("ab*","a ab abb abbb abbbbb")) # result:['a', 'ab', 'abb', 'abbb', 'abbbbb'] +:代表左边的字符重复1次到无穷次 # print(re.findall("ab+","a ab abb abbb abbbbb")) # result:['ab', 'abb', 'abbb', 'abbbbb'] {n,m}:代表左边的字符重复n次到m次 # print(re.findall("ab{0,}","a ab abb abbb abbbbb")) #不写表示到无穷次 同* # result:['a', 'ab', 'abb', 'abbb', 'abbbbb'] # print(re.findall("ab{0,1}","a ab abb abbb abbbbb")) #同? # print(re.findall("ab{1,}","a ab abb abbb abbbbb")) #同+ .*: 匹配任意0个到无穷个字符,贪婪匹配 # print(re.findall('a.*c','a123213123asdfasdfc123123123123+-0)((c123123')) .*?:匹配任意0个到无穷个字符,非贪婪匹配 # print(re.findall('a.*?c','a123213123asdfasdfc123123123123+-0)((c123123')) 斜杠的用法 # print(re.findall("a\\c","ac a9c")) #两个转意斜杠 # result:['a\c'] #其中一个斜杠为转意的意思 |:或者 ()分组 # print(re.findall("egon(sb|nb)","egonnb dao lda egonsb ")) # result:['nb', 'sb'] # print(re.findall("egon(?:sb|nb)","egonnb dao lda egonsb ")) # result:['egonnb', 'egonsb'] I 忽略大小写 # print(re.findall("alex","aLex ALEX Alex",re.I)) # ['aLex', 'ALEX', 'Alex'] M 以换行符为切分标志 进行切分 # msg=""" # baduabha egon # dbajhajcba egon # xbhnauhnihbaegon # """ # print(re.findall("egon$",msg)) # result:['egon'] # print(re.findall("egon$",msg,re.M)) # result:['egon', 'egon', 'egon'] # print(re.findall("egon",msg,re.M)) # result:['egon', 'egon', 'egon']
2、re模块下的方法:
# ===========================re模块提供的方法介绍=========================== #import re 1 findall 返回所有满足匹配条件的结果,放在列表里 #print(re.findall('e','alex make love') ) # result:['e', 'e', 'e'] 2 search 只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 #print(re.search('e','alex love').group()) # result:e, 3 match 同search,不过在字符串开始处进行匹配,完全可以用search+^代替match #print(re.match('e','alex make love')) #result:None, 4 split 先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割 #print(re.split('[ab]','abcd')) #result:['', '', 'cd'], #5 print('===>',re.sub('a','A','alex make love')) #===> Alex mAke love,不指定n,默认替换所有 print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love print('===>',re.sub('^(w+)(.*?s)(w+)(.*?s)(w+)(.*?)$',r'52341','alex make love')) #===> love make alex print('===>',re.subn('a','A','alex make love')) #===> ('Alex mAke love', 2),结果带有总共替换的个数 #6 obj=re.compile('d{2}') print(obj.search('abc123eeee').group()) #12 print(obj.findall('abc123eeee')) #['12'],重用了obj
二、hashlib模块
1、什么是hash hash是一种算法,该算法接受一系列的数据,经过运算会得到一个hash值, hash值具备三大特性: a、只要传入的内容一样,那么得到的hash值一定是一样
b、只要采用hash算法固定,无论传入的内容多大,hash值的长度是固定
c、hash值不可逆,即不能通过hash值逆推出内容
2、为何要用hash
特性1+2=>文件完整性校验
3、hashlib模块的使用
import hashlib m=hashlib.md5()# m=hashlib.sha256() m.update('hello'.encode('utf8')) #给hashlib传入原材料 print(m.hexdigest()) #5d41402abc4b2a76b9719d911017c592 #根据算法计算出hash值 m.update('alvin'.encode('utf8')) print(m.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af m2=hashlib.md5() m2.update('helloalvin'.encode('utf8')) print(m2.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af ''' 注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样 但是update多次为校验大文件提供了可能。 '''