python之路 正则表达式,模块导入的方法,hashlib加密

一、正则表达式re

python中re模块提供了正则表达式相关操作

 字符:

   . 匹配除换行符以外的任意字符
  w 匹配字母或数字或下划线或汉字
  s 匹配任意的空白符
  d 匹配数字
   匹配单词的开始或结束
  ^ 匹配字符串的开始
  $ 匹配字符串的结束

次数:

  * 重复零次或更多次
  + 重复一次或更多次
  ? 重复零次或一次
  {n} 重复n次
  {n,} 重复n次或更多次
  {n,m} 重复n到m次

 

模式描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}  
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) G匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
w 匹配字母数字
W 匹配非字母数字
s 匹配任意空白字符,等价于 [ f].
S 匹配任意非空字符
d 匹配任意数字,等价于 [0-9].
D 匹配任意非数字
A 匹配字符串开始
 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
z 匹配字符串结束
G 匹配最后匹配完成的位置。
 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
,  , 等. 匹配一个换行符。匹配一个制表符。等
1...9 匹配第n个分组的子表达式。
10 匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

正则表达式实例

 实例描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符

特殊字符类

实例描述
. 匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
d 匹配一个数字字符。等价于 [0-9]。
D 匹配一个非数字字符。等价于 [^0-9]。
s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
S 匹配任何非空白字符。等价于 [^ f v]。
w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

1.re.match

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。。

1 re.match(pattern, string, flags=0)
 pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

注:匹配成功re.match方法返回一个匹配的对象,否则返回None。

使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例:

 1 import re
 2 print(re.match('www', 'www.yaomr.com'))
 3 显示如下:
 4 <_sre.SRE_Match object; span=(0, 3), match='www'>
 5 如果要显示匹配几个字符
 6 print(re.match('www', 'www.yaomr.com').span())
 7 效果:
 8 0, 3)
 9 如果匹配不到则返回:
10 print(re.match('www', 'ww.yaomr.com'))
11 显示:
12 None

实例:

1 import re
2 res = re.match('d+', '123uuasf')
3 if res:
4     print (res.group())
5 else:
6     print(None)
7 》》123

2、re.search

1 print(re.search('www', 'www.yaomr.com').span())# 在起始位置匹配
2 >>>(0, 3)
3 print(re.search('yao', 'www.yaomr.com').span())#不在起始位置匹配
4 >>>(4, 7)
1 obj = re.search('d+','u123uu888asf')
2 print(obj)
3 >>>  <_sre.SRE_Match object; span=(1, 4), match='123'>
4 print(obj.group())
5 >>>  123

3、match和search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

 1 line = "Cats are smarter than dogs";
 2 
 3 matchObj = re.match( r'dogs', line, re.M|re.I)
 4 if matchObj:
 5    print ("match --> matchObj.group() : ", matchObj.group())
 6 else:
 7    print ("No match!!")
 8 
 9 matchObj = re.search( r'dogs', line, re.M|re.I)
10 if matchObj:
11    print ("search --> matchObj.group() : ", matchObj.group())
12 else:
13    print ("No match!!")
14 
15 >>>No match!!#match没有匹配到
16 >>>search --> matchObj.group() :  dogs#search匹配到了

4、re.sub方法

Python 的re模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl,string, max=0)

返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。

可选参数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。

实例:

1 aaa = "2004-959-559 # This is Phone Number"
2 # Delete Python-style comments
3 num = re.sub('#.*$', "", aaa)
4 print ("Phone Num : ", num)
5 >>>Phone Num :  2004-959-559 
6 # Remove anything other than digits
7 num = re.sub('D', "", aaa)
8 print ("Phone Num : ", num)
9 >>>Phone Num :  2004959559

5、group和groups

1 a = "123abc456"
2 print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).group())
3 print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0))#0代表所有123abc456
4 print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1))#123
5 print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2))#abc
6 print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups())#放在一个元组里('123', 'abc', '456')

6、findall(pattern,string,flags=0)

如果想要匹配到字符串中所有符合条件的元素,则需要使用findall。

1 obj = re.findall('d+', 'fa123uu888asf')
2 print (obj)#['123', '888']列表

7、split

1 # split,根据正则匹配分割字符串
2 split(pattern, string, maxsplit=0, flags=0)
3 # pattern: 正则模型
4 # string : 要匹配的字符串
5 # maxsplit:指定分割个数
6 # flags  : 匹配模式
 1 # 无分组
 2 origin = "hello alex bcd alex lge alex acd 19"
 3 r = re.split("alex", origin, 1)
 4 print(r)   #['hello ', ' bcd alex lge alex acd 19']
 5 
 6 
 7 # 有分组
 8 origin = "hello alex bcd alex lge alex acd 19"
 9 r1 = re.split("(alex)", origin, 1)
10 print(r1)#['hello ', 'alex', ' bcd alex lge alex acd 19']
11 r2 = re.split("(al(ex))", origin,1)
12 print(r2)#['hello ', 'alex', 'ex', ' bcd alex lge alex acd 19']

二、导入模块的方法

1 import module
2 from module.xx.xx import xx
3 from module.xx.xx import xx as rename 
4 from module.xx.xx import *
5 
6 导入模块其实就是告诉Python解释器去解释那个py文件
7     导入一个py文件,解释器解释该py文件
8     导入一个包,解释器解释该包下的 __init__.py 文件 【py2.7】

三、hashlib

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

 1 import hashlib
 2  
 3 # ######## md5 ########
 4 hash = hashlib.md5()
 5 # help(hash.update)
 6 hash.update(bytes('admin', encoding='utf-8'))
 7 print(hash.hexdigest())
 8 print(hash.digest())
 9  
10  
11 ######## sha1 ########
12  
13 hash = hashlib.sha1()
14 hash.update(bytes('admin', encoding='utf-8'))
15 print(hash.hexdigest())
16  
17 # ######## sha256 ########
18  
19 hash = hashlib.sha256()
20 hash.update(bytes('admin', encoding='utf-8'))
21 print(hash.hexdigest())
22  
23  
24 # ######## sha384 ########
25  
26 hash = hashlib.sha384()
27 hash.update(bytes('admin', encoding='utf-8'))
28 print(hash.hexdigest())
29  
30 # ######## sha512 ########
31  
32 hash = hashlib.sha512()
33 hash.update(bytes('admin', encoding='utf-8'))
34 print(hash.hexdigest())

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

1 import hashlib
2  
3 # ######## md5 ########
4  
5 hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
6 hash.update(bytes('admin',encoding="utf-8"))
7 print(hash.hexdigest())

python内置还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密

1 import hmac
2  
3 h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
4 h.update(bytes('admin',encoding="utf-8"))
5 print(h.hexdigest())
原文地址:https://www.cnblogs.com/zhangkui/p/5595399.html