zoukankan      html  css  js  c++  java
  • 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())
  • 相关阅读:
    团队展示
    原型设计(结对第一次)
    第二次作业——个人项目实战
    第一次作业--准备篇
    课程作业四
    课程作业三
    课程作业二
    课程作业一
    图像处理------ 一阶微分应用 (转载)
    dennis gabor 从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换(转载)
  • 原文地址:https://www.cnblogs.com/zhangkui/p/5595399.html
Copyright © 2011-2022 走看看