python中正則表達式findall的用法實例
正則口徑:知道前后取中間,如果最后$結束
python中則這表達式的方法通常由re.match re.search re.findall
re.findall匹配的時候,會把結果放到list返回,如果沒有匹配到返回空list不會報錯
import re s1=re.compile('\d+') # 匹配數字 r1=s1.findall('sahduasu27bhsagd7236vbcsahg923') print(r1) s2=re.compile('\d+') r2=re.findall(s2, 'gashgddsh32hjsagd3jh4hjk234jkhk213') print (r2) r3=re.findall('\d+', 'sjdjsk1232kdsjf324string') print(r3) # 執(zhí)行結果 # ['27', '7236', '923'] # ['32', '3', '4', '234', '213'] # ['1232', '324']
示例及常用方式:
import re a = "hfdsakjhabsdgfjhabhjgdjabhjgajbkdkjdhfkaab" # 1.找出字符串中有多少個ab, 兩個字符挨著 r1= re.findall(r"ab", a) print(r1) # 繼續(xù)查找如ab, aab, aaab,aaaab這種,a可以重復,也就是匹配前面的a是1個或多個 # +是代表前面的字符出現1次或多次 r2= re.findall(r"a+b", a) print(r2) # *是代表匹配前面的字符出現0次或多次 r3= re.findall(r"a*b", a) print(r3) # 我們要匹配a和b之間有一個字符的,比如aab,abb,acb,adb都符合 # .就是匹配除 \n (換行符)以外的任意一個字符 r4= re.findall(r"a.b", a) print(r4) # 執(zhí)行結果: # ['ab', 'ab', 'ab', 'ab'] # ['ab', 'ab', 'ab', 'aab'] # ['ab', 'ab', 'ab', 'b', 'aab'] # ['ajb', 'aab']
貪婪與非貪婪:
import re # 符號.* 貪婪,匹配從.*前面為開始到后面為結束的所有內容 a = "hfdsakjhabsdgfjhabhjgdjabhjgajbkdkjdhfkaabsdf" r1= re.findall(r"a.*b", a) print(r1) # 符號.*? 非貪婪,遇到開始和結束就進行截取,因此截取多次符合的結果,中間沒有字符也會被截取 r2= re.findall(r"a.*?b", a) print(r2) # ['akjhabsdgfjhabhjgdjabhjgajbkdkjdhfkaab'] # ['akjhab', 'ab', 'ab', 'ajb', 'aab']
import re # # 符號.* 貪婪,匹配從.*前面為開始到后面為結束的所有內容 a = "hfdsakjhabsdgfjhabhjgdjabhjgajbkdkjdhfkaabsdf" r1= re.findall(r"hfdsak.*?jgdj", a) print(r1) r2= re.findall(r"hfdsak(.*?)jgdj", a) print(r2) # ['hfdsakjhabsdgfjhabhjgdj'] # ['jhabsdgfjhabh'] # 看到區(qū)別了么,就是取出來的數據是否帶頭尾
re.S
前面匹配都是一整串沒有換行的情況,如果我們需要匹配的內容,中間剛好有換行了,那就匹配不到了。
import re a = '''hfdsakjhabsdgfjhabhjgdj abhjgajbkdkjdhfkaabsdf''' r1= re.findall(r"hfdsak.*?kjdh", a) print(r1) # [] r2= re.findall(r"hfdsak(.*?)jgdj", a,flags=re.S) print(r2) # ['jhabsdgfjhabh']
正則表達式可以包含一些可選標志修飾符來控制匹配的模式。修飾符被指定為一個可選的標志。
修飾符 | 描述 |
---|---|
re.I | 使匹配對大小寫不敏感 |
re.L | 做本地化識別(locale-aware)匹配 |
re.M | 多行匹配,影響 ^ 和 $ |
re.S | 使 . 匹配包括換行在內的所有字符 |
re.U | 根據Unicode字符集解析字符。這個標志影響 \w, \W, \b, \B. |
re.X | 該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。 |
多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志
補充:實戰(zhàn)案例
如果上面的函數和參數含義都已經掌握了,還需要進一步通過案例加強理解,接下來舉例說明上面的三個函數:
# 導入用于正則表達式的re模塊 import re # 取出字符串string8中所有的天氣狀態(tài) string8 = "{ymd:'2018-01-01',tianqi:'晴',aqiInfo:'輕度污染'},{ymd:'2018-01-02',tianqi:'陰~小雨',aqiInfo:'優(yōu)'},{ymd:'2018-01-03',tianqi:'小雨~中雨',aqiInfo:'優(yōu)'},{ymd:'2018-01-04',tianqi:'中雨~小雨',aqiInfo:'優(yōu)'}" # 基于正則表達式使用findall函數 print(re.findall("tianqi:'(.*?)'", string8)) # 取出string9中所有含O字母的單詞 string9 = 'Together, we discovered that a free market only thrives when there are rules to ensure competition and fair play, Our celebration of initiative and enterprise' # 基于正則表達式使用findall函數 print(re.findall('w*ow*',string9, flags = re.I)) # 將string10中的標點符號、數字和字母刪除 string10 = '據悉,這次發(fā)運的4臺蒸汽冷凝罐屬于國際熱核聚變實驗堆(ITER)項目的核二級壓力設備,先后完成了壓力試驗、真空試驗、氦氣檢漏試驗、千斤頂試驗、吊耳載荷試驗、疊裝試驗等驗收試驗。' # 基于正則表達式使用sub函數 print(re.sub('[,。、a-zA-Z0-9()]','',string10)) # 將string11中的每個子部分內容分割開 string11 = '2室2廳 | 101.62平 | 低區(qū)/7層 | 朝南 上海未來 - 浦東 - 金楊 - 2005年建' # 基于正則表達式使用split函數 split = re.split('[-| ]', string11) print(split) # 分割結果的清洗 split_strip = [i.strip() for i in split] print(split_strip) out: ['晴', '陰~小雨', '小雨~中雨', '中雨~小雨'] ['Together', 'discovered', 'only', 'to', 'competition', 'Our', 'celebration', 'of'] 據悉這次發(fā)運的臺蒸汽冷凝罐屬于國際熱核聚變實驗堆項目的核二級壓力設備先后完成了壓力試驗真空試驗氦氣檢漏試驗千斤頂試驗吊耳載荷試驗疊裝試驗等驗收試驗 ['2室2廳 ', ' 101.62平 ', ' 低區(qū)/7層 ', ' 朝南 ', ' 上海未來 ', ' 浦東 ', ' 金楊 ', ' 2005年建'] ['2室2廳', '101.62平', '低區(qū)/7層', '朝南', '上海未來', '浦東', '金楊', '2005年建']
如上結果所示:
第一個例子中通過正則表達式"tianqi:’(.*?)’“實現目標數據的獲取,如果不使用括號的話,就會產生類似"tianqi:‘晴’”, "tianqi:‘陰~小雨’"這樣的值,所以,加上括號就是為了分組,且僅返回組中的內容;
第二個例子并沒有將正則表達式寫入圓括號,如果寫上圓括號也是返回一樣的結果,所以findall就是用來返回滿足匹配條件的列表值,如果有括號,就僅返回括號內的匹配值;
第三個例子使用替換的方法,將所有的標點符號換為空字符,進而實現刪除的效果;
第四個例子是對字符串的分割,如果直接按照正則 ‘[,。、a-zA-Z0-9()]’ 分割的話,返回的結果中包含空字符,如 ‘2室2廳’ 后面就有一個空字符。為了刪除列表中每個元素的首尾空字符,使用了列表表達式,并且結合字符串的strip方法完成空字符的壓縮。
總結
到此這篇關于python中正則表達式findall用法的文章就介紹到這了,更多相關python正則表達式findall用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mac中PyCharm配置Anaconda環(huán)境的方法
這篇文章主要介紹了Mac中PyCharm配置Anaconda環(huán)境的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03python的scrapy框架之Pipeline文件的用法詳解
這篇文章主要介紹了python的scrapy框架之Pipeline文件的用法詳解,Pipeline是一個獨立的模塊,用于處理從Spider中提取的Item對象,實現對數據的進一步處理、存儲和清洗等操作,下面將詳細介紹Scrapy框架中Pipeline的用法,需要的朋友可以參考下2023-10-10Python爬蟲實現獲取動態(tài)gif格式搞笑圖片的方法示例
這篇文章主要介紹了Python爬蟲實現獲取動態(tài)gif格式搞笑圖片的方法,結合實例形式分析了Python針對gif格式圖片的爬取、下載等相關操作技巧,需要的朋友可以參考下2018-12-12