一、正则表达式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())