re模块、hashlib模块

一.re模块

1.什么是正则?

正则就是用一系列具有特殊含义的字符组成一套规则,该规则用来描述具有某一特征的字符串,
正则就是用来去一个大的字符串中匹配出符合规则的子字符串

2.为何要用正则?

用户注册,爬虫程序

3.常用方法:

import re

print(re.findall('w','Aah123 +-_'))
#['A', 'a', 'h', '1', '2', '3', '_']

print(re.findall('w9w','Aa9h123 aaa9c+-_'))
# ['a9h','a9c']

print(re.findall('W','Aah123 +-_'))
#[' ', '+', '-']
print(re.findall('s','Aah	12
3 +-_'))
#['	', '
', ' ']
print(re.findall('S','Aah	12
3 +-_'))
#['A', 'a', 'h', '1', '2', '3', '+', '-', '_']
print(re.findall('d','Aah	12
3 +-_'))
#['1', '2', '3']
print(re.findall('D','Aah	12
3 +-_'))
#['A', 'a', 'h', '	', '
', ' ', '+', '-', '_']

print(re.findall('	','Aah	12
3 +-_'))
#['	']
print(re.findall('
','Aah	12
3 +-_'))
#['
']

# ^: 仅从头开始匹配
print(re.findall('^alex','alex is alex is alex'))
#['alex']

# $: 仅从尾部开始匹配
print(re.findall('alex$',' alex is alex is alex'))
['alex']

# .: 代表匹配一个字符,该字符可以是除换行符之外任意字符 #如果后面跟上re.DOTALL就是可以匹配全部任意的字符
print(re.findall('a.c','a a1c aaac a c asfdsaf a
c',re.DOTALL))                                      
# ['a1c','aac','a c','a
c']

# []:代表匹配一个字符,这一个字符是来自于我们自定义的范围,[]内的上尖号表示的是取反
print(re.findall('a[0-9]c','a,c a a1c a9c aaac a c asfdsaf a
c',re.DOTALL))
print(re.findall('a[a-zA-Z]c','a,c aAc a1c a9c aaac a c asfdsaf a
c',re.DOTALL))
print(re.findall('a[a-zA-Z]c','a,c aAc a1c a9c aaac a c asfdsaf a
c',re.DOTALL))
print(re.findall('a[+*/-]c','a,c a+c a-c a*c a/c aAc a1c a9c aaac a c asfdsaf a
c',re.DOTALL))
print(re.findall('a[+*-/]c','a,c a+c a-c a*c a/c aAc a1c a9c aaac ac asfdsaf a
c',re.DOTALL))
print(re.findall('a[^0-9]c','a,c a a1c a9c aaac a c asfdsaf a
c',re.DOTALL))

# 重复匹配
# ?:代表左边那一个字符出现0次到1次
print(re.findall('ab?','a ab abb abbbb a123b a123bbbb'))                                         
# ['a','ab','ab','ab','a','a']

# *: 代表左边那一个字符出现0次到无穷次
print(re.findall('ab*','a ab abb abbbb a123b a123bbbb'))
# ['a','ab','abb','abbbb','a','a']

# +: 代表左边那一个字符出现1次到无穷次
print(re.findall('ab+','a ab abb abbbb a123b a123bbbb'))

# ['ab','abb','abbbb']

# {n,m}:代表左边那一个字符出现n次到m次
print(re.findall('ab{1,3}','a ab abb abbbb a123b a123bbbb'))
# ['ab', 'abb', 'abbb']
print(re.findall('ab{1,}','a ab abb abbbb a123b a123bbbb'))
print(re.findall('ab+','a ab abb abbbb a123b a123bbbb'))

print(re.findall('ab{0,}','a ab abb abbbb a123b a123bbbb'))
print(re.findall('ab*','a ab abb abbbb a123b a123bbbb'))

print(re.findall('ab{3}','a ab abb abbbb a123b a123bbbb'))


# .*: 匹配任意0个到无穷个字符,贪婪匹配
print(re.findall('a.*c','a123213123asdfasdfc123123123123+-0)((c123123'))

#.*?:匹配任意0个到无穷个字符,非贪婪匹配
print(re.findall('a.*?c','a123213123asdfasdfc123123123123+-0)((c123123'))

#|:或者
print(re.findall('companies|company','Too many companies have gone bankrupt,c and the next one is my company'))
#忽略大小写
print(re.findall('alex','my name is alex Alex is dsb aLex ALeX',re.I))

msg="""
my name is egon
asdfsadfadfsadf egon
123123123123123egon
"""
print(re.findall('egon$',msg,re.M)) #my name is egon
asdfsadfadfsadf egon
123123123123123egon'


## print(re.findall('a\c','ac')) #对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,会发生转义,然后交给re去执行,所以抛出异常
print(re.findall(r'a\c','ac')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
print(re.findall('a\\c','ac')) #同上面的意思一样,和上面的结果一样都是['a\c']

#():分组
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>'))#['http://www.baidu.com']
print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">点击</a>'))#['href="http://www.baidu.com"']
#['1', '2', '60', '-40.35', '5', '-4', '3']取出其中的数字
msg="1-2*(60+(-40.35/5)-(-40*3))"
print(re.findall('D?(-?d+.?d*)',msg))

re模块的其他方法:

res=re.search()  #只匹配成功一次,就结束,res.group() 取其中的分组,如果不写,就全取,如果写参数,就只取参数所对应的那个组

res=re.match()  #只从开头进行匹配,相当于在search中的正则表达式中加 上尖号

# res=re.findall('(href)="(.*?)"','<p>动感视频</p><a href="https://www.douniwan.com/1.mp4">逗你玩呢</a><a href="https://www.xxx.com/2.mp4">葫芦娃</a>')
# print(res)

# res=re.search('(href)="(.*?)"','<p>动感视频</p><a href="https://www.douniwan.com/1.mp4">逗你玩呢</a><a href="https://www.xxx.com/2.mp4">葫芦娃</a>')
# print(res)
# print(res.group(0))
# print(res.group(1))
# print(res.group(2))


# res=re.match('abc','123abc') ## res=re.search('^abc','123abc')
# print(res)

# print(re.findall('alex','alex is alex is alex'))
# print(re.search('alex','alex is alex is alex'))
# print(re.match('alex','alex is alex is alex'))

# pattern=re.compile('alex')
# print(pattern.findall('alex is alex is alex'))
# print(pattern.search('alex is alex is alex'))
# print(pattern.match('alex is alex is alex'))
View Code

二.hashlib模块

1.什么是hash?

hash是一种算法,该算法接受一系列的数据,经过运算会得到一个hash值。

hash值具备三大特性:

       1.传入的内容一样,得到的hash值一定一样,换句话说hash值一样,内容就一样。

       2.如果采用的hash算法固定,无论传入的内容多大,hash值的长度是固定的。

       3.hash值不可逆,就是说不能通过hash值逆推出内容。

2.为何要用hash?

        特性1+2=>文件完整性的校验

        特性3=>用于加密

import hashlib

m=hashlib.md5()
m.update('你好'.encode('utf-8'))
m.update('hello'.encode('utf-8'))
print(m.hexdigest()) #65c83c71cb3b2e2882f99358430679c3

m1=hashlib.md5()
m1.update('你好hello'.encode('utf-8'))
print(m1.hexdigest()) #65c83c71cb3b2e2882f99358430679c3
print(len(m1.hexdigest())) #32

m2=hashlib.sha512()
m2.update(b'asdfassssssssssssssssssssssssssss')
print(m2.hexdigest())
print(len(m2.hexdigest()))
原文地址:https://www.cnblogs.com/wangke0917/p/10077776.html