程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

讓python飛:形象理解python re模塊、元字符、分組、替換與切割

編輯:Python


Day16 飛機長與 阿依土鱉公主
一只大飛機在高空中高傲的飛翔,突然一只蜘蛛爬到了大飛機的背部。大飛機頓時迷失了方向,來到了非洲的一個王國,叫阿依王國
(re模塊)這個王國有個阿依土鱉公主。這個公主有四個隨從,能幫她查找國內任何人。他們都有自己的領地。大飛機拜見了阿依土鱉公主。公主領著他來到了match的領地,match是一個相撲選手(函數:match(regex,string,[flags=0]))公主會將她的指令放在一個能打開的球裡面,球裡有一個阿依土鱉公主的金質像章(regex:就是正則表達式(內部定義了一套驗證規則))頭像上還有個小鐮刀(我們之後在定義正則表達式的時候,在它的第一個引號前面,都顯示的追加一個r,無腦行為...)一個要被查詢的人的名單(string:需要被驗證的字符串數據)和一個小旗子。小旗子處有時候會放一些小標志,意思是對人群進行命令(flags:模式/標志位,默認情況下(不顯示定義) --> 不開啟任何的模式)比如說小旗子處放了個華表下面的石柱,表示對於所有符合的目標一視同仁,全部帶回來,不管大人小孩(flags的取值:re.I:忽略大小寫)阿撲在人群中去找目標,不過他性格比較莽撞,如果第一個目標不符合,他就不再找了。直接告訴公主他沒找到(將string數據從頭開始嘗試匹配 【注意】:如果開頭就不匹配,那麼直接返回None值)如果找到了,就把他們裝到火柴盒裡,給公主(如果匹配成功,那麼就會返回給程序一個match對象)被火柴盒裝回來的人可能會經過五次問詢。group大隊長會讓裡面所有的人都出來站到一張紙上(group():返回匹配成功的數據值(理解:原串中的某部分子串信息))groups小隊長有個丸子串,他會讓火柴盒裡拉幫結派的小組站出來,讓小組長站到丸子串上去(groups():返回所有子組的信息,以元祖的形式返回;如果沒有進行正則的分組,即返回一個空元祖對象)還有點魚頭叫的話,第一個被匹配到的人就把他在隊伍中的位置告訴魚頭(start():返回匹配成功的數據的起始索引)魚尾叫的話,最後一個被匹配到的人就把他的位置報給魚尾(end(): 返回匹配成功的數據的結束索引)還有個叫span的盛魚的盤子就把魚頭和魚尾盛進去,盤子上畫的是兩個丸子(span(): 返回一個元祖對象,有兩個元素組成;第一個元素記錄了匹配成功的數據的起始索引; 第二個元素記錄了匹配成功的數據的結束索引)大飛機讓match給找找有沒有一個叫zhuzhu的蜘蛛,阿撲沒找到。土鱉公主覺得可能是自己沒有表達好,所以阿依土鱉公主就把他帶到了第二個隨從的領地。
第二個隨從叫compile,他是一個戴著眼鏡的小編輯
(compile(regex,[flags=0]):)他能把阿依土鱉公主的金質像章和小紅旗繡到一個圓圓的繡布上(函數執行完畢以後返回給程序一個Pattern對象(理解:對象的內部封裝了一套regex和flags),)小編輯拿著繡布再去找阿撲,阿撲看到繡布就只用把要找的人的名單放進火柴盒就可以啦(可以再通過Pattern對象調用其match函數(此時的match函數只需要傳遞一個參數:string即可))由於公主比較喜歡繡花,所以一般就先把命令告訴小編輯,讓他再去傳達

pat = re.compile(r'www',flags=re.I)
print(pat.match('www.baidu.com'))

阿依土鱉公主和大飛機來到了第三個隨從的領地。他是個礦工,腦門上還安了一個探照燈函數:search(regex,string,[flags=0])參數:和match一樣理解)他拿到土鱉公主球球指令後,還是比較聽話的,但是呢由於是在編制內工作,一旦找到目標,他就會把目標同樣放在火柴盒裡,帶回來,就別再往下找了(從頭開始嘗試匹配,如果開頭就匹配不成功,不會返回None值,會繼續嘗試往後匹配;一旦匹配成功了,就直接返回一個match對象,後續就算還存在可以匹配成功的子串數據,也不會再匹配了(直接無視);如果直到最後都匹配不成功,返回一個None值;)他帶回來是個火柴盒,所以阿撲的那五個手下也能對其進行操作(【注意】:由於search函數調用返回的是match對象,所以仍然可以調用5個常用的函數)同樣,他也能接受小編輯的繡花布指令

compile()配合search()使用:
# pat = re.compile(r'www')
# mo = pat.search('Wwww.sina.com!!www.baidu.com!!www')
# print(mo)

小礦工也沒能幫大飛機找到zhuzhu。於是乎,他們來到了第四個隨從的領地。
第四個隨從是個淘金者(函數:findall(regex,string,[flags=0]):)他能直接接受土鱉公主的半球指令,將所有符合要求的目標全部找出來,但是呢,他比較富有,沒有火柴盒,就一個他們都裝在一個大表上返回將所有匹配成功的子數據(子串),都存入到列表中返回;)同樣,他也能接受小編輯的繡布指令

# compile()和findall()一起使用:
# pat = re.compile(r'www',flags=re.I)
# lt = pat.findall('www.sina.com!!www.baidu.com!!WWW')
# print(lt)

結果淘金者也沒有找到zhuzhu。
阿依土鱉公主說,別氣餒!我還有其他的隊伍呢~
她大喊一聲,元家軍都給我過來!這時,有三組人馬急急忙忙從城門進入。第一組叫單元小分隊,他們能從一個一個目標的找。單元小分隊一共有六個人。大哥是箱子哥
([]:表示一字符位)他是一個被劈成兩半的箱子,裡面可以放各種各樣的目標。你想要找哪個,就把他的樣本放進去,它就在人群中找出哪個([0-9a-zA-Z_]:表示一位,取值范圍:0~9、a~z、A~Z以及_中的任何一個值)二弟是拿著木棍的孫越(\d)他能將阿拉伯人揪出來(\d:表示一位,取值范圍:[0,9]中間的任何一位值)三弟是拿大木棍的張飛(\D)他能將除了阿拉伯人以外的人都揪出來(\D:對以上的\d進行取反,意味著:匹配除了數字字符以外的所有字符)二弟三弟配合起來,目空一切!四弟是拿著木棍的無天(\w)他能將所有的變量名字找出來(\w:表示一位,取值范圍:0~9、a~z、A~Z以及_中的任何一個值)五弟就是拿著木棍的如來了(\W)他能將所有的變量名之外的人找出來。最後,還有一個西瓜君,除了門神(\n)他能將所有的生物找到

.: 匹配除了換行符以外的所有字符)!(reg = r'[12345]'
reg = r'[0-9]'
reg = r'\d'
reg = r'\d\d'
reg = r'\D\d'
reg = r'\w\d[a-z][0-9]'
reg = r'..'

介紹完單元小分隊六兄弟後,他們各自施法

# print(re.match(reg,'\n_6a842'))
# print(re.search(reg,'\n_6a842')) # print(re.findall(reg,'\n_6a842'))

並配合公主的隨從一起尋找zhuzhu。結果還是失敗了。
接下來,錨邊小分隊閃亮登場
(匹配錨字符(邊界字符):)錨邊小分隊也是有六兄弟。老大是個頭戴尖尖帽的片警他只能從隊伍的前面往後面數,而且只能一個街道一個街道的找,每個街道都得從頭找一遍(^:從字符串數據的頭部開始匹配,在開啟了多行模式的情況下(re.M),它可以嘗試匹配每一行的頭部數據)二弟是個腳踩美元圖案帆布鞋的片警($)他和大哥相反,他從隊伍的最後面進行尋找,也是一個一個街道的查($:從字符串數據的尾部開始匹配,在開啟了多行模式的情況下(re.M),它可以嘗試匹配每一行的尾部數據)三弟是個拿大棒子的美國隊長(\A)他哪管什麼街道不街道的,就從第一行第一個人開始找(\A:從字符串數據的頭部開始匹配,在開啟了多行模式的情況下(re.M),它沒有多行的概念,還是匹配第一行的頭部數據)四弟是個拿大棒子的閃電俠,他配合美國隊長,從隊伍的最後面開始找(\Z:從字符串數據的尾部開始匹配,在開啟了多行模式的情況下(re.M),它沒有多行的概念,還是匹配最後一行的尾部數據)五弟是個拿大棒子的邊防戰士(\b)他能從隊伍的左右兩邊尋找目標(\b:嘗試匹配邊界(左側、右側)數據,如果一旦滿足返回對象(match、list))六弟是個拿大棒子的特警戰士(\B)不管是誰,他一定要從左邊開始查找。俗稱一根筋(\B:先捨棄規定邊界的數據,然後一定滿足從左側開始匹配數據,...)錨邊小分隊配合隨從結果也已失敗告終

# print(re.search(r'^www','hahawww.qfedu.comhehe'))
# print(re.search(r'hehe$','hahawww.qfedu.comhehe'))
# print(re.search(r'\Awww','hahawww.qfedu.comhehe'))
# print(re.search(r'hehe\Z','hahawww.qfedu.comhehe'))
# print(re.search(r'ne\b','never'))
print(re.search(r'er\B','ernerver'))

。於是乎,第三個小分隊多配小分隊也閃亮登場。這個小分隊還有兩個小組,一個叫高度近視組(1).模糊匹配)該組有三名成員,分別是腦門有個問號的小孩(x?:表示0個或者1個 取值范圍:[0,1])他手裡拿了一個雞蛋和一根火腿。第二個成員是帶著老花鏡的白求恩大夫,他左手拿著一根火腿,右手拿著一個眼罩(x+:表示1個或者多個 取值范圍:[1,無窮大])第三個成員是一個海星,它左手拿著一個雞蛋,右手拿著一個眼罩(x*:表示0個或者多個 取值范圍:[0,無窮大))他們能把找到的目標盡可能多的帶回來

【注意事項】:
關於以上模糊匹配涉及到的三個符號(?、+、*)都滿足了正則中的貪婪匹配的行為/特點;
理解:在確保匹配的前提下,盡可能多的返回數據

當然,如果你不想要那麼多,就把頭上有問號的小朋友放在你右邊,你就能節制的尋找了。

print(re.findall(r'a?',str1))
print(re.findall(r'a??',str1))
print(re.findall(r'a+',str1))
print(re.findall(r'a+?',str1))
print(re.findall(r'a*',str1))
print(re.findall(r'a*?',str1))
['a', 'a', 'a', 'a', 'a', 'a', 'a', '', '', '', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', '']
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['aaaaaaa', 'aaaaaaaaa']
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
['aaaaaaa', '', '', '', 'aaaaaaaaa', '']
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

還有第二個小組叫精確制導組(精確匹配)裡面有三個雙鍋蓋,第一個雙鍋蓋中間夾著一個數字(n{x}: 將n匹配x次)第二個雙鍋蓋中間夾著一個數字和一只小狗(n{x,}: 將n最少有x次,最多無窮大 范圍:[x,無窮多))第三個雙鍋蓋裡夾著一個兩個數字和一只狗({x,y}: 將n最少有x次,最多有y次 范圍:[x,y])你想要一次性找幾個相同的目標,這個小組就能給你找出來。

str3 = 'aaaaaaacccaaaaaaaaaa'
print(re.findall(r'a{3}',str3))
print(re.findall(r'a{3,}',str3))
print(re.findall(r'a{3,}?',str3))
print(re.findall(r'a{8,10}',str3))
print(re.findall(r'a{8,10}?',str3))
['aaa', 'aaa', 'aaa', 'aaa', 'aaa']
['aaaaaaa', 'aaaaaaaaaa']
['aaa', 'aaa', 'aaa', 'aaa', 'aaa']
['aaaaaaaaaa']
['aaaaaaaa']

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved