正则表达式,hashlib模块

一.正则表达式

Python中三引号(三个单引号或者双引号)则有两种用法,一是使一个字符串跨多行 二是多行注释

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))

二.hashlib模块

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())

 

posted @ 2018-12-06 19:45  Zhuang_Z  阅读(158)  评论(0编辑  收藏  举报