您好,登錄后才能下訂單哦!
這篇文章主要介紹了正則表達式+Python re模塊的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
正則表達式(Regluar Expressions)又稱規(guī)則表達式,在代碼中常簡寫為REs,regexes或regexp(regex patterns)。它本質(zhì)上是一個小巧的、高度專用的編程語言。 通過正則表達式可以對指定的文本實現(xiàn)
匹配測試、內(nèi)容查找、內(nèi)容替換、字符串分割 等功能。
re模塊介紹
Python中的re模塊提供了一個正則表達式引擎接口,它允許我們將正則表達式編譯成模式對象,然后通過這些模式對象執(zhí)行模式匹配搜索和字符串分割、子串替換等操作。re模塊為這些操作分別提供了模塊級別的函數(shù)以及相關類的封裝。
總是在量詞范圍內(nèi)盡量多匹配 - 貪婪
總是在量詞范圍內(nèi)盡量少匹配 - 惰性
.*?x 匹配任意內(nèi)容任意次數(shù) 遇到x就停止
.+?x 匹配任意內(nèi)容至少1次 遇到x就停止
. 有特殊的意義,取消特殊的意義\
取消一個元字符的特殊意義有兩種方法
在這個元字符前面加 \
對一部分字符生效,把這個元字符放在字符組里
[.()+?*]
findall
會優(yōu)先顯示分組內(nèi)的內(nèi)容
*****取消優(yōu)先顯示(?:正則)
search
只能返回第一個符合條件的項
得到的結果需要.group取值
默認獲取完整的匹配結果
通過group(n)取第n個分組中的內(nèi)容
# search 還是按照完整的正則進行匹配,顯示也顯示匹配到的第一個內(nèi)容,但是我們可以通過給group方法傳參數(shù) # 來獲取具體文組中的內(nèi)容 ret = re.search('9(\d)(\d)','19740ash93010uru') print(ret) # 變量 -- > <re.Match object; span=(1, 4), match='974'> if ret: print(ret.group()) # --> 974 print(ret.group(1)) # --> 7 print(ret.group(2)) # --> 4 # findall # 取所有符合條件的,優(yōu)先顯示分組中的 # search 只取第一個符合條件的,沒有優(yōu)先顯示這件事兒 # 得到的結果是一個變量 # 變量.group() 的結果 完全和 變量.group(0)的結果一致 # 變量.group(n) 的形式來指定獲取第n個分組中匹配到的內(nèi)容 # 加上括號 是為了對真正需要的內(nèi)容進行提取 ret = re.findall('<\w+>(\w+)</\w+>','<h2>askh930s02391j192agsj</h2>') print(ret) # --> ['askh930s02391j192agsj']
其他的內(nèi)容在代碼中有詳細的注釋,大家可以復制我的代碼一步一步運行然后實驗
以下的內(nèi)容有:split sub subn math,compile,finditer
# split sub subn math,compile,finditer # split res = re.split('\d+', "cyx123456cyxx") print(res) # --> ['cyx', 'cyxx'] res = re.split('(\d+)', "cyx123456cyxx") # 保留分組 print(res) # --> ['cyx', '123456', 'cyxx'] # sub 替換 res = re.sub('\d+', '我把數(shù)字替換了', "cyx123456cyxxx123456") # 默認全部替換,當然也可以替換一次re.sub('\d+','我把數(shù)字替換了',"cyx123456cyxxx123456",1) print(res) # --> cyx我把數(shù)字替換了cyxxx我把數(shù)字替換了 # subn 替換了并顯示替換的次數(shù) res = re.subn('\d+', '我把數(shù)字替換了', "cyx123456cyxxx123456") print(res) # --> ('cyx我把數(shù)字替換了cyxxx我把數(shù)字替換了', 2) # match 這個就相當與加了個^ (和search差不多) --> 主要用來規(guī)定這個字符號必須是什么樣的 res = re.match('\d+', 'cyx123456cyxxx') print(res) # --> None res = re.match('\d+', '123cyx456cyxxx') print(res.group()) # --> 123 # compile -- 節(jié)省代碼的時間的工具 # 假如同一個正則表達式要被使用多次 # 節(jié)省了多次解析同一個正則表達式的時間 ret = re.compile("\d+") res = ret.search("cyx12456cyxXX123") print(res.group()) # --> 12456 # finditer --> 節(jié)省空間 ret = re.finditer("\d+", "cyx123456cyxxx125644") for r in ret: print(r.group()) # --> 123456 # 125644 # 怎么又節(jié)省時間又節(jié)省空間呢? ret = re.compile('\d+') res = ret.finditer("cyx222231fddsf45746sdf2123sdf56456sdf10123sdf123132sdf") for r in res: print(r.group()) """ 222231 45746 2123 56456 10123 123132 """ # 分組命名(?P<組名>正則) (?P=組名) # 有的時候我們要匹配的內(nèi)容是包含在不想要的內(nèi)容之中的, # 只能先把不想要的內(nèi)容匹配出來,然后再想辦法從結果中去掉 # 分組命名的用法 (找兩個組里面是一樣的內(nèi)容) exp = '<abc>asdasf54545645698asdasd</abc>00545sdfsdf</abd>' ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)', exp) print(ret) # -- > <re.Match object; span=(0, 33), match='<abc>asdasf54545645698asdasd</abc'> # exp2: import re ret = re.search('\d(\d)\d(\w+?)(\d)(\w)\d(\d)\d(?P<name1>\w+?)(\d)(\w)\d(\d)\d(?P<name2>\w+?)(\d)(\w)', '123abc45678agsf_123abc45678agsf123abc45678agsf') print(ret.group('name1')) # -- > agsf_123abc print(ret.group('name2')) # -- > agsf
今日小思考
當我們有一個這樣的列表:
lis = ['', 'z', 'c', 'asd', 'sdf', '', 'asd']
那么我們?nèi)绾螌⒗锩娴目兆址麆h除呢?
ret = filter(lambda n: n, lis) print(list(ret)) # --> ['z', 'c', 'asd', 'sdf', 'asd']
感謝你能夠認真閱讀完這篇文章,希望小編分享的“正則表達式+Python re模塊的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。