python 之 re模塊、hashlib模塊

来源:https://www.cnblogs.com/mylu/archive/2019/06/26/11094163.html
-Advertisement-
Play Games

6.16 re模塊 正則就是用一些具有特殊含義的符號組合到一起(稱為正則表達式)來描述字元或者字元串的方法。或者說:正則就是用來描述一類事物的規則.(在Python中)它內嵌在Python中,並通過 re 模塊實現。 re模塊的其他方法: 6.17 hashlib模塊 hash是一種演算法,該演算法接受 ...


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 \r1\n2\t+- *&_')) 匹配任意空白字元 [\r\n\t\f] [' ', '\r', '\n', '\t', ' ']
\S print(re.findall('\S','ab \r1\n2\t+- *&_')) 匹配任意非空字元 ['a', 'b', '1', '2', '\', '+', '-', '*', '&', '_']
\d print(re.findall('\d','ab \r1\n2\t+- *&_')) 匹配任意數字 [0-9] ['1', '2']
\D print(re.findall('\D','ab \r1\n2\t+- *&_')) 匹配任意非數字 ['a', 'b', ' ', '\r', '\n', '\t', '\', '+', '-', ' ', '*', '&', ']
\A print(re.findall('\Aalex','abcalex is sb')) 匹配字元串的開始 [ ]
^ print(re.findall('^alex','alex is salexb')) 相當於\A ['alex']
\Z print(re.findall('sb\Z','alex is alexbsb')) 匹配字元串的結尾 ['sb']
$ print(re.findall('sb$','alex is alexbsb')) 相當於\Z ['sb']
\n print(re.findall('a\nc','a\nc a\tc a1c')) 匹配一個換行符 ['a\nc']
. print(re.findall('a.c','abc a1c aaca\nc')) 除了換行符外的任意一個字元 ['abc', 'a1c', 'aac']
re.DOTALL print(re.findall('a.c','abc a1c aaca\nc',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.txt\3333/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'\1\2\3EGON\5','123 egon is beutifull egon 123'))
#(123)(egon)( is beutifull )(egon)(123)
print(re.sub('(lqz)(.*?)(SB)',r'\3\2\1',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'\5\2\3\4\1',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:\Users\Desktop\上節課複習','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())

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 代理模式:為其他對象提供一種代理來控制對這個對象的訪問。我們來看這樣一個簡單的例子,現在超市商家不直接把商品交給客戶,而是通過一些平臺的外賣小哥把商品送到客戶手中,此時外賣小哥就起到了代理的作用。代碼如下: ...
  • 今天我們來看一個編程語言入門必演示的HelloWorld程式,藉此來展示我們的重點知識。話不多說,先看代碼。 本段代碼在eclipse中編輯運行,怎麼在eclipse中新建項目呢:點擊左上角File選擇New一個Project.雖然本例僅僅實現了一個簡單的輸出HelloWorld一行字元串的簡單功能 ...
  • 花下貓語:之前說過,我對於編程語言跟其它學科的融合非常感興趣,但我還說漏了一點,就是我對於 Python 跟其它編程語言的對比學習,也很感興趣。所以,我一直希望能聚集一些有其它語言基礎的同學,一起討論共通的語言特性間的話題。不同語言的碰撞,常常能帶給人更高維的視角,也能觸及到語言的根基,這個過程是極 ...
  • 數據結構與演算法的關係 數據結構(data structure)是一門研究組織數據方式的學科,有了編程語言也就有了數據結構。學好數據結構可以編寫出跟家漂亮,更加有效率的代碼 要學好數據結構就要多多考慮如何將生活中遇到的問題,用程式去實現解決 程式=數據結構+演算法 數據結構是演算法的基礎,換言之,想要學好 ...
  • 今天在別人代碼中發現java8 新特性,發現自己閱讀代碼有點兒吃力,很是汗顏,java8新特性都出來這麼久了,只知其名不見其形,所有今天回家補了補知識。 一、 介面 在java8 中,介面中引入了新的關鍵字default和static,通過使用default修飾方法,可以讓我們在介面中定義具體的方法 ...
  • 轉載請標明博客的地址 本人博客和github賬號,如果對你有幫助請在本人github項目AioSocket上點個star,激勵作者對社區貢獻 個人博客:https://www.cnblogs.com/haibiscuit/ 個人github: https://github.com/haibiscui ...
  • Java在複製一個對象時有淺拷貝與深拷貝之分,具體區別就不在此贅述,本文主要分析Java深拷貝的幾種方法以及他們的效率高低。 1. 使用Java序列化方法 想要深拷貝一個對象,常用的方法是序列化為數據流,此方法的前提是對象以及對象中包含的子對象都要繼承Serializable介面。 2. 利用Kry ...
  • spring框架提供了構建web的應用程式的全功能MVC模塊 spring mvc。我們首先來寫一個springmvc的hellword的配置文件的形式 工程結構如下 index.jsp requestScope:表示變數的作用域,一共4種。pageScope: 表示變數只能在本頁面使用。reque ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...