• python 之 re模块、hashlib模块


    6.16 re模块

    正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 re 模块实现。

    模式举例解释结果
    w print ( re.findall ('w','ab 12+- *&_') ) 匹配字母数字下划线 ['a', 'b', '1', '2', '_']
    W print ( re.findall ('W','ab 12+- *&_') ) 匹配非字母数字下划线 [' ', '', '+', '-', ' ', '*', '&']
    s print(re.findall('s','ab 1 2 +- *&_')) 匹配任意空白字符 [ f] [' ', ' ', ' ', ' ', ' ']
    S print(re.findall('S','ab 1 2 +- *&_')) 匹配任意非空字符 ['a', 'b', '1', '2', '', '+', '-', '*', '&', '_']
    d print(re.findall('d','ab 1 2 +- *&_')) 匹配任意数字 [0-9] ['1', '2']
    D print(re.findall('D','ab 1 2 +- *&_')) 匹配任意非数字 ['a', 'b', ' ', ' ', ' ', ' ', '', '+', '-', ' ', '*', '&', ']
    A print(re.findall('Aalex','abcalex is sb')) 匹配字符串的开始 [ ]
    ^ print(re.findall('^alex','alex is salexb')) 相当于A ['alex']
     print(re.findall('sb','alex is alexbsb')) 匹配字符串的结尾 ['sb']
    $ print(re.findall('sb$','alex is alexbsb')) 相当于 ['sb']
    print(re.findall('a c','a c a c a1c')) 匹配一个换行符 ['a c']
    . print(re.findall('a.c','abc a1c aaca c')) 除了换行符外的任意一个字符 ['abc', 'a1c', 'aac']
    re.DOTALL print(re.findall('a.c','abc a1c aaca c',re.DOTALL)) 匹配包括换行符的任意一个字符  
    print(re.findall('ab?','a ab abb abbb abbbb abbbb')) 左边一个字符重复0次或1次 ['a', 'ab', 'ab', 'ab', 'ab', 'ab']
    * print(re.findall('ab*','a ab abb abbb abbbb abbbb a1bbbbbbb')) 左边一个字符出现0次或无穷次 ['a', 'ab', 'abb', 'abbb', 'abbbb', 'abbbb', 'a']
    + print(re.findall('ab+','a ab abb abbb abbbb abbbb a1bbbbbbb')) 左边一个字符出现1次或无穷次 ['ab', 'abb', 'abbb', 'abbbb', 'abbbb']
    {m,n} print(re.findall('ab{0,1}','a ab abb abbb abbbb abbbb')) 左边一个字符出现m次到n次 ['a', 'ab', 'ab', 'ab', 'ab', 'ab']
    .* print(re.findall('a.*c','ac a123c aaaac a *123)()c asdfasfdsadf')) 匹配任意长度,任意的字符 贪婪匹配 ['ac a123c aaaac a *123)()c']
    .*? print(re.findall('a.*?c','a123c456c')) 非贪婪匹配 ['a123c']
    () print(re.findall('(alex)_sb','alex_sb asdfsafdafdaalex_sb')) 匹配括号内的表达式 ['alex', 'alex']
           
           

     

    print(re.findall('^ebn$','ebn1'))                               #[]
    print(re.findall('href="(.*?)"','<li><a id="blog_nav_sitehome" class="menu"href="http://www.cnblogs.com/">博客园</a></li>')
    )                                                            #['http://www.cnblogs.com/']
    print(re.findall('a[0-9][0-9]c','a1c a+c a2c a9c a11c a-c acc aAc'))#[]:匹配一个指定范围内的字符(这一个字符来自于括号内定义的)                                      #['a11c']
    print(re.findall('a[-+*]c','a1c a+c a2c a9c a*c a11c a-c acc aAc')) #当-需要被当普通符号匹配时,只能放到[]的最左边或最右边                                       ['a+c', 'a*c', 'a-c']
    print(re.findall('a[a-zA-Z]c','a1c a+c a2c a9c a*c a11c a-c acc aAc'))  #['acc', 'aAc']
    print(re.findall('a[^a-zA-Z]c','a c a1c a+c a2c a9c a*c a11c a-c acc aAc'))# []内的^代表取反的意思
                                                #['a c', 'a1c', 'a+c', 'a2c', 'a9c', 'a*c', 'a-c']
    print(re.findall('([a-z]+)_sb','egon alex_sb123123wxxxxxxxxxxxxx_sb,lxx_sb'))#['alex', 'wxxxxxxxxxxxxx', 'lxx']    
    print(re.findall('compan(ies|y)','Too many companies have gone bankrupt, and the next one is my company'))                                                      #| :或者 ['ies', 'y']
    print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next one is my company'))    #(?:):代表取匹配成功的所有内容,而不仅仅只是括号内的内容 ['companies', 'company']

    re模块的其他方法:

    print(re.findall('alex|sb','123123 alex sb sadfsadfasdfegon alex sb egon'))#['alex', 'sb', 'alex', 'sb']
    print(re.search('alex|sb','123213 alex sb sadfsadfasdfegon alex sb egon').group())#只到找到第一个匹配,然后返回一个包含匹配信息的对象   #alex
    print(re.search('^alex','123213 alex sb sadfsadfasdfegon alex sb egon'))# None 匹配不成功返回None而不是[]
    print(re.search('^alex','alex sb sadfsadfasdfegon alex sb egon').group())       #alex
    print(re.match('alex','alex sb sadfsadfasdfegon alex sb egon').group())         #alex
    print(re.match('alex','123213 alex sb sadfsadfasdfegon alex sb egon'))          #None
    #search+^可以代替match
    info='a:b:c:d'
    print(info.split(':'))          #['a', 'b', 'c', 'd']
    print(re.split(':',info))       #['a', 'b', 'c', 'd']
    ​
    info=r'get :a.txt3333/rwx'
    print(re.split('[ :\/]',info))    #['get', '', 'a.txt', '3333', 'rwx']
    print('egon is beutifull egon'.replace('egon','EGON',1))    #EGON is beutifull egon
                                                            #123 egon is beutifull EGON 123
    print(re.sub('(.*?)(egon)(.*?)(egon)(.*?)',r'123EGON5','123 egon is beutifull egon 123'))
                #(123)(egon)( is beutifull )(egon)(123)
    print(re.sub('(lqz)(.*?)(SB)',r'321',r'lqz is SB'))# SB is lqz
                #(lqz)(is)(SB)                      
    print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)',r'52341',r'lqzzzz123+ is SB'))                #SB123+ is lqzzzz                          #(lqzzzz)(123+ )(is)( )(SB)
    pattern=re.compile('alex')
    print(pattern.findall('alex is alex alex'))                         #['alex', 'alex', 'alex']
    print(pattern.findall('alexasdfsadfsadfasdfasdfasfd is alex alex'))   #['alex', 'alex', 'alex']

    6.17 hashlib模块

    hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值

    hash值的特点是:

    1 只要传入的内容一样,得到的hash值必然一样(用于明文传输密码、文件完整性校验) 2 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码 3 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的

    import hashlib
    m=hashlib.md5()
    ​
    m.update('hello'.encode('utf-8'))
    m.update('world'.encode('utf-8'))
    m.update('egon'.encode('utf-8'))
    print(m.hexdigest()) #3801fab9b8c8d9fcb481017969843ed5
    import hashlib
    m=hashlib.md5()
    ​
    m.update('h'.encode('utf-8'))
    m.update('e'.encode('utf-8'))
    m.update('lloworld'.encode('utf-8'))
    m.update('egon'.encode('utf-8'))
    print(m.hexdigest()) #3801fab9b8c8d9fcb481017969843ed5

     注意:m.update()无论是多次传值还是一次传值,得到的hash值相同

    import hashlib
    m=hashlib.md5()
    with open(r'C:UsersDesktop上节课复习','rb') as f:
        for line in f:
            m.update(line)
        hv=m.hexdigest()
    print(hv) #98416536bdf1f0dc0776629f501ae469

    密码加盐

    import hashlib
    m=hashlib.md5()
    ​
    pwd='alex3714'
    m.update('天王盖地虎'.encode('utf-8'))
    m.update(pwd.encode('utf-8'))
    m.update('小鸡炖蘑菇'.encode('utf-8'))
    ​
    print(m.hexdigest())    #ab44c43ea02e8c1083346ca707a6f572

    hashlib.sha256(),hashlib.sha512()

    import hashlib
    ​
    m=hashlib.md5()
    m.update('helloworld'.encode('utf-8'))
    print(m.hexdigest()) #fc5e038d38a57032085441e7fe7010b0
    ​
    m=hashlib.sha256()
    m.update('helloworld'.encode('utf-8'))
    print(m.hexdigest()) #936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af
    ​
    m=hashlib.sha512()
    m.update('helloworld'.encode('utf-8'))
    print(m.hexdigest()) #1594244d52f2d8c12b142bb61f47bc2eaf503d6d9ca8480cae9fcf112f66e4967dc5e8fa98285e36db8af1b8ffa8b84cb15e0fbcf836c3deb803c13f37659a60

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

    import hmac
    m=hmac.new('天王盖地虎,小鸡炖模块'.encode('utf-8'))
    m.update('alex3814'.encode('utf-8'))
    print(m.hexdigest())
  • 相关阅读:
    SET TEXTSIZE number
    Oracle 参数之_small_table_threshold
    Oracle等待事件db file parallel read
    ORA-12631 / TNS-12631: Username retrieval failed
    Oracle的Connect By理解
    ORA-01436: 用户数据中的CONNECT BY 循环
    Cortex-M3启动深度解析
    【SmartOS】轻量级多任务调度系统
    物联网智能硬件设备身份验证机制
    物联网智能硬件设备常见攻击方法
  • 原文地址:https://www.cnblogs.com/mylu/p/11094163.html
Copyright © 2020-2023  润新知