python正则_Python基础12之Python正则
上圖施工計劃,已完成專題:
1.數字專題
2.字符串專題
3.列表專題
4.流程控制專題
5.編程風格專題
6.函數使用專題
7.面向對象編程(上篇)
8.面向對象編程(下篇)
9.Python基礎9之數據結構(上)
10.Python基礎9之數據結構(下)
11.Python基礎10之類、包、模塊
正則使用需要掌握的主要知識,整篇文章的結構總結如下:
1 學習正則的價值
2 正則學習前的幾個準備
Q1 字符 `r`是干啥的?
Q2 什么是一個原子操作?
Q3 怎么理解正則中的轉義?
3 掌握最常用規則
情況1:最普通查找
情況2:使用通用字符
情況3:使用元字符
4 有個棘手的場景
5 學會提取子串的技能
6 使用捕獲的注意事項
1 學習正則的價值
正則應用廣泛。不僅在Python語言中使用,其他語言也都在用,并且不同語言間的正則語法極為相似。同時主流操作系統,尤其linux系統的命令窗口中,也會經常使用到正則。還有,Python的常用包如Pandas,也經常遇到正則。
不僅使用廣泛,正則功能也很強大,還有書寫簡便,因此這項技能值得我們仔細研究和掌握。
2 正則學習前的幾個準備
Q1 字符?r是干啥的?
經常見過正則表達式前有一個字符?r,它的作用是告訴解釋器后面的一串是原生字符串,按照字面意思解釋即可。如:
r'\n.*'它告訴編譯器s串第一個字符是\,第二個字符是n.打印的結果就是它本身:
\n.*而如果不帶前綴字符r,即:
'\n.*'解釋器認為前兩個字符\n為轉義字符,一個新行的意思,打印結果為一個換行加.*,如下所示:
.*
Q2 什么是一個原子操作?
微觀世界中,如果定義原子是組成事物的最基本單元,那么就可理解為原子不能再分了。同理此處,正則的原子操作是指不能再被分割的正則表達式操作。
如正則中的+指前面的一個原子操作出現至少1次。例如:66+表示第一個字符為6,第二個字符6和第三個字符+聯合起來表示至少出現1次字符6,因此綜合起來至少要有2個6緊鄰的串才能滿足此正則表達式(下面會詳細講到)。
\w+表示字母數字下劃線中的任意一個字符(\w指代的)至少出現1次,那么\w就是一個原子操作。
因此,普通字符是原子,正則中的通用字符(下面會講到)也是原子。大家記住原子這個概念。
Q3 怎么理解正則中的轉義?
正則世界中,重新定義了幾個新的轉義字符。
一個轉義字符\+一個字符,轉義后會改變原字符的意義,它不再是它,而是賦予一個新的含義。
例如,w本身就是一個英文字符w,沒有其他任何含義。但是,前面加一個轉義字符?\后,含義發生重大改變,w它不再是w,而是\要與w連在一起,被解釋器解釋為匹配以下字符集合中的任意一個:
'\w'等于:
pat?=?'[0123456789??????AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
??????_]'
即匹配數字、大小寫字母和下劃線_字符集合中的任意一個。
你看,一個通用轉義字符\w直接就指代上面這一大串,寫法多么簡便,同時在正則的世界里又經常被用到,故被稱為:通用正則字符
類似的通用正則字符還有幾個,下面也會講到。做一件事前,把規則弄清,觸類旁通,相信大家理解其他幾個也沒問題。
3 掌握最常用規則
為了更清晰的展示,咱們只涉及最常用的規則,一來縮短篇幅,二來降低大家學習曲線,三來一類問題掌握一個,觸類旁通即可。
情況1:最普通查找
最普通查找就是需要找啥就寫啥,沒有使用正則的規則。如下是關于小說《燦爛千陽》中的一段話,從中找出單詞friendship,可能出現多次:
s?=?"""#?Mariam?is?only?fifteen?
#?when?she?is?sent?to?Kabul?to?marry?the?troubled?and?bitter?Rasheed,
#?who?is?thirty?years?her?senior.?
#?Nearly?two?decades?later,?
#?in?a?climate?of?growing?unrest,?tragedy?strikes?fifteen-year-old?Laila,?
#?who?must?leave?her?home?and?join?Mariam's?unhappy?household.?
#?Laila?and?Mariam?are?to?find?consolation?in?each?other,?
#?their?friendship?to?grow?as?deep?as?the?bond?between?sisters,?
#?as?strong?as?the?ties?between?mother?and?daughter.?
#?With?the?passing?of?time?comes?Taliban?rule?over?Afghanistan,?
#?the?streets?of?Kabul?loud?with?the?sound?of?gunfire?and?bombs,?
#?life?a?desperate?struggle?against?starvation,?brutality?and?fear,?
#?the?women's?endurance?tested?beyond?their?worst?imaginings.?
#?Yet?love?can?move?a?person?to?act?in?unexpected?ways,?
#?lead?them?to?overcome?the?most?daunting?obstacles?with?a?startling?heroism.?
#?In?the?end?it?is?love?that?triumphs?over?death?and?destruction.?
#?A?Thousand?Splendid?Suns?is?an?unforgettable?portrait?of?a?wounded?country?and
#??a?deeply?moving?story?of?family?and?friendship.?
#??It?is?a?beautiful,?heart-wrenching?story?of?an?unforgiving?time,?
#??an?unlikely?bond?and?an?indestructible?love.
"""
使用正則前,先導入re模塊,再定義正則表達式,然后使用findall方法找出所有匹配
import?re以上就是使用正則的最普通例子。如果要找出前綴為grow的單詞,比如可能為grows, growing 等,最普通查找實現起來就不方便。
然而,借助于下面介紹的元字符、通用字符和捕獲組合起來,便能應對解決復雜的匹配查找問題。
情況2:使用通用字符
在正則的世界里,通用字符指幫助我們更加簡便的寫出匹配規則的字符。
如上面文字,下面正則匹配串能找出以d開始,[a-z]表示的任意一個小寫英文字符,{7}表示小寫英文字符出現7次(下面情況3會說到),也就是匹配出來的子串長度為1+7=8:
'd[a-z]{7}'匹配結果為:
'daughter',?同理,模式串pat = 'd[a-z]{10}'匹配的結果為:
'destruction',?模式串pat = 'd[a-z]{11}'匹配的結果為:
'destructible']你看,通用字符[a-z]使用真方便,5個字符一下就表達了所有26個小寫的字符,但是注意[a-z]匹配26個小寫字符的任意一個.
類似功能的通用字符還包括:
[A-Z]??匹配大寫英文字母[0-9]??匹配一個0-9之間的數字
還有更加強大的通用字符:
\s??匹配空白字符,如\n?\t?\b等\w??匹配任意字母、數字、下劃線?
\d??匹配十進制數字0-9
而\S, \W, \D 分別對應 \s, \w, \d匹配字符集的補集,例如\S 的意思是匹配 \s 以外的其他任意字符。
情況3:使用元字符
元的含義大家不妨理解為用來描述它后面事物的類,如元類用來創建描述類的類,元模型描述一個模型的模型,因此推而廣之,元字符用來描述字符的字符。
理解以上后,你再看正則中使用最普遍的一個元字符?+,它是用來描述前面一個原子出現次數的字符,表示前一個原子出現1次或多次都可。
例如,在尋找手機靚號時,正則表達式66+,表示前一個原子6至少出現1次,因此連上第一個6,表示電話號碼中至少有兩個66緊鄰。因此,電話號碼18612652166、17566665656都滿足要求,而號碼18616161616不符合要求。
類似功能的元字符,還包括如下。功能相似,不再贅述:
*?前面的原子重復0次、1次、多次?4 有個棘手的場景
了解以上規則后,我們能去完成很多匹配任務,比如一些字符串匹配任務;查找某個手機號是不是靚號;找到文字中出現某個模式的所有地方。
但是,使用正則還會經常遇到的一大場景。試想,從一個文件里提取出所有如下格式的鏈接,并全部導出來:
https://github.com/jackzhenguo/python-small-examples
https://gitbook.cn/gitchat/column/5e37978dec8d9033cf916b5d
截止目前,我們還不能完成這樣的匹配任務。鑒于這種匹配任務確實很常見,因此你很有必要學會下面這項技能。
5 學會提取子串的技能
今天以我寫過的《Python 60天》專欄中的一段文字,提取出里面的鏈接為例,闡述提取子串的實用性。
先貼上文字(有刪減改動),將這段文字賦值給變量?urls:
"""基于 Python 的包更是枝繁葉茂,遍地開花,“Tiobe 編程語言排行榜”最新統計顯示 Python 是增長最快的語言。

接下來,與大家,還有遠在美國做 AI 博士后研究的 Alicia,一起開始我們的 60?天 Python 探索之旅吧。
所有的這些考慮,都是為了讓大家在短時間內掌握 Python 技術棧,多一個生存的本領。拿到理想的 Offer 后,早日過上自己想要的生活。
讓我們開始吧。
如下,按照是否為靜態/動態語言,弱類型/強類型兩個維度,
總結常用的語言分類。
?###?四大基本語法
"""
你可能很快寫出如下的正則表達式:
#?元字符.表示匹配除\n字符外的任意一個字符然后導入re模塊,使用findall方法找出所有匹配:
import?re運行結果顯示如下,觀察發現2個匹配,但是每個匹配鏈接都包括冗余字符,因此匹配錯誤:
'https://images.gitbook.cn/2020-02-05-014719.png)',
我們再稍微優化原正則表達式為:
#?添加?\)?表示待匹配子串以右括號結尾打印結果顯示如下,結果確實好一點,但是依然包括右括號,結果還是錯誤的:
'https://images.gitbook.cn/2020-02-05-014719.png)',?
所以掌握提取子串的技能就很重要,實現提取子串也很簡單,只需把想要返回的子串加上一對括號就行,如下所示:
#?把想要返回的子串外面添加一對括號此時返回結果完全正確,無任何多余字符。想要返回的子串外面添加一對括號還有個專業叫法:捕獲或分組。
6 使用捕獲的注意事項
捕獲功能非常實用,使用它需要區分一點,貪婪捕獲和非貪婪捕獲。前者指在滿足匹配模式前提下,返回包括盡可能多的字符匹配模式;后者指滿足匹配條件下,盡可能少的捕獲。
我們偽造一個理想狀況下的案例:
htmlContent?=?"""????????<div><div><h2>這是二級標題h2>div><div><p>?這是一個段落>/p>div>div>
"""
貪心捕獲使用(.*),如下所示:
r"(.*)"結果為如下,盡可能長的捕獲,而不是遇到第一個
時就終止:<div>而非貪心捕獲的正則表達式為
(.*?)",如下:r"(.*?)"結果為兩個元素,遇到第一個
時終止,然后繼續捕獲出第二子串:<div>以上例子僅僅用作演示兩者區別,實際的html結構含有換行符等,環境比上面要復雜的多,貪心和非貪心捕獲的寫法可能不會導致結果不同,但是我們依然需要理解它們的區別。
關注公眾號送免費資料
回復Jenkins?領取Jenkins學習資料回復Jmeter?領取Jmeter學習資料
回復Java? ?領取Java學習資料
回復Python?領取python入門資料
回復RobotFramework???領取RobotFramework 框架搭建資料
你可能會喜歡
Jmeter關聯系列_數據驅動中的業務邏輯關聯
docker搭建接口自動化持續集成框架
python28:迷宮游戲最短路徑算法
Python基礎11之類和包和模塊
神經網絡初探4:Tensorflow2.0數據集與神經網絡初探
盤一盤 Python 系列基礎篇十一之 機器學習 Sklearn
盤一盤 Python 系列特別篇21之:SciPy 稀疏矩陣
Linux環境部署之ubuntu網絡配置
性能測試指標7:性能測試的階段性工作
jmeter之對jar包進行調用
jmeter之爬取網絡圖片
軟件質量保障體系圖
研發過程中的測試工作
APP測試流程及測試點
WEB測試范圍小結
測試交流,加我備注【測試交流】拉入交流群,更有不定期資料贈送,敬請期待
本文轉載自【Python與算法社區】
總結
以上是生活随笔為你收集整理的python正则_Python基础12之Python正则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机屏大字滚动_在iPhone手机中,实
- 下一篇: 抽象工厂模式java_面试官:说一下静态