正则表达式,hashlib模块
1.什么事正则?
正则就是用一些具有特殊含义的符号组合到一起(成为正则表达式)来描述字符或者字符串的方法.
正则就是用来描述一类事物的规则.在python中,它内嵌在python中,并通过re模式实现.
2.常用匹配模式(元字符)
import re
^: 从头开始匹配,匹配字符串的开头
# print(re.findall('^alex','1alex3alex'))
$: 从尾部开始匹配,匹配字符串的末尾
# print(re.findall('henry$','hery_li is the best henry'))
. :匹配一个字符,该字符可以是任意字符,除了换行符 当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符.
[] :代表匹配一个字符,这一个字符可以自定义范围 [35] 3和5 [3-5] 3到5 []中的^代表非
重复匹配:都不能单独使用
? :代表左边那一个字符出现0次或1次
* :代表左边那一个字符出现0次到无穷次
+ :代表左边那一个字符出现1次到无穷次
{n,m} :代表左边那个字符出现n次到m次
{n} :代表左边那个字符出现n次
组合使用
.*:匹配任意0个到无穷个字符 贪婪匹配,尽可能多的吃掉字符
.*?:匹配任意0个到无穷个字符 非贪婪匹配
补充:
a|b:匹配a或b
():分组,组选择
print(re.findall('compan(y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
只留组内
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
?: :取消只留组内,拿到匹配成功所有的内容
\转译
a\\c 首先被python语法识别成a\c,python没有正则表达式功能,其实是调用了C语言正则表达式功能,下来把a\c交给C语言正则表达式功能.
a\\c 首先被python语法识别成a\\c,下来在C语言的正则表达式识别成a\c
print(re.findall('a\\\\c','a\c aac'))
结果:a\\c 第一个\是转译的意思
\w 匹配任意一个文字字符,包括字母数字及下滑线,等价于[a-zA-Z0-9]
\W 匹配任意一个非文字字符,非字母数字下滑线,等价于[^a-zA-Z0-9]
\s 匹配任意一个空白字符 空格 TAB 换行,等价于[\t\n\r\f\v].
\S 匹配任意一个非空字符,等价于[^\t\n\r\f\v].
\d 匹配任意一个数字字符,等价于[0-9]
\D 匹配任意一个非数字字符
\n 匹配一个换行符
\t 匹配一个制表符及一个空格
print(re.findall(r'a\\c','a\c aac'))
r代表原生字符串,告诉python解释器python语法不要动直接将a\\c传给c语言的正则表达式
re.I 使匹配对大小写不敏感
print(re.findall('henry','henry is star HENRY is good boy Henry like is Irene',re.I))
结果:['henry', 'HENRY', 'Henry']
re.M 多行匹配影响$和^
msg='''
my name is henry
irene like henry
wendy like henry
'''
print(re.findall('henry$',msg))
结果:['henry']
print(re.findall('henry$',msg,re.M))
结果:['henry', 'henry', 'henry']
re.A只包含ASCII码
msg='''
henry
irene
温蒂
'''
print(re.findall('\w{2,5}',msg))
结果:['henry', 'irene', '温蒂']
print(re.findall('\w{2,5}',msg,re.A))
结果:['henry', 'irene']
#re模式其他方法
res=re.findall('href="(.*?)"','<href="https://www.hao123.com/3.mp3">酷酷的滕<href="https://www.hao123.com/1.mp3">')
print(res)
结果:['https://www.hao123.com/3.mp3', 'https://www.hao123.com/1.mp3']
re.search()
res=re.search('href="(.*?)"','<href="https://www.hao123.com/3.mp3">酷酷的滕<href="https://www.hao123.com/1.mp3">')
print(res)
结果:<_sre.SRE_Match object; span=(1, 36), match='href="https://www.hao123.com/3.mp3"'>
res=re.search()只匹配成功一次就结束,不会往后匹配
print(res.group()) print(res.group(0))取分组,默认取出完整的分组
结果:href="https://www.hao123.com/3.mp3"
res=re.search('(href)="(.*?)"','<href="https://www.hao123.com/3.mp3">酷酷的滕<href="https://www.hao123.com/1.mp3">')
print(res.group(0))
print(res.group(1))
print(res.group(2))
结果:
href="https://www.hao123.com/3.mp3"
href
https://www.hao123.com/3.mp3
re.match('ab','ab123)等同于re.search('^ab','ab123')
pattern=re.compile('henry')
print(pattern.findall('henry is henry is henry'))
print(pattern.search('henry is henry is henry'))
print(pattern.match('henry is henry is henry'))
# ['1', '2', '60', '-40.35', '5', '-40', '3']
msg="1-2*(60+(-40.35/5)-(-40*3))"
print(re.findall('\D?(-?\d+\.?\d*)',msg))
1.什么是hash?
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值.
2.hash就有三大特性
2.1 只要传入的内容一样,得到的hash值必然一样
2.2 只要使用的hash算法不变,无论校验的内容多大,得到的hash值长度是固定的
2.3 不能由hash值返解成内容,hash值不可逆,即不能通过hash值逆推出内容
3.为何要用hash?
特性1+2=>文件完整性校验
import hashlib
m=hashlib.md5() #hash工厂 md5是hash算法 ()可以传值
m.update()#必须传入bits类型
m.update('你好'.encode('utf-8'))
m.update('美女'.encode('utf-8')) #原材料
print(m.hexdigest()) #产品 结果:57d60e88a20ae60d228989070c7333ff
m=hashlib.md5()
m.update('你好帅哥'.encode('utf-8'))
print(m.hexdigest()) #结果:57d60e88a20ae60d228989070c7333ff
print(len(m.hexdigest())) #32
m=hashlib.md5()
m.update(b'abcbdsakdaksdksjd')
print(len(m.hexdigest())) #32
m=hashlib.sha512()
m.update(b'abcbdsakdaksdksjd')
print(len(m.hexdigest())) #128
import hashlib
with open(r'E:\python-li\课堂\day17\hash',mode='rb') as f:
m=hashlib.md5()
for line in f:
m.update(line)
print(m.hexdigest())
一般不用上面的方法,而是从文件里随机选几段内容
import hashlib
pwd=input('password>>:').strip()
m=hashlib.md5()
m.update('从前从前有个人爱你很久'.encode('utf-8'))
m.update(pwd.encode('utf-8'))
m.update('但偏偏风渐渐把距离吹得好远'.encode('utf-8'))
print(m.hexdigest())