域名預(yù)訂/競(jìng)價(jià),好“米”不錯(cuò)過(guò)
正則表達(dá)式(Regluar Expressions)又稱規(guī)則表達(dá)式,在代碼中常簡(jiǎn)寫(xiě)為REs,regexes或regexp(regex patterns)。這篇文章主要介紹了正則表達(dá)式+Python re模塊詳解,需要的朋友可以參考下
正則表達(dá)式(Regluar Expressions)又稱規(guī)則表達(dá)式,在代碼中常簡(jiǎn)寫(xiě)為REs,regexes或regexp(regex patterns)。它本質(zhì)上是一個(gè)小巧的、高度專(zhuān)用的編程語(yǔ)言。 通過(guò)正則表達(dá)式可以對(duì)指定的文本實(shí)現(xiàn)
匹配測(cè)試、內(nèi)容查找、內(nèi)容替換、字符串分割 等功能。
re模塊介紹
Python中的re模塊提供了一個(gè)正則表達(dá)式引擎接口,它允許我們將正則表達(dá)式編譯成模式對(duì)象,然后通過(guò)這些模式對(duì)象執(zhí)行模式匹配搜索和字符串分割、子串替換等操作。re模塊為這些操作分別提供了模塊級(jí)別的函數(shù)以及相關(guān)類(lèi)的封裝。
Python --> re模塊 findall
會(huì)優(yōu)先顯示分組內(nèi)的內(nèi)容
*****取消優(yōu)先顯示(?:正則)
search
只能返回第一個(gè)符合條件的項(xiàng)
得到的結(jié)果需要.group取值
默認(rèn)獲取完整的匹配結(jié)果
通過(guò)group(n)取第n個(gè)分組中的內(nèi)容
# search 還是按照完整的正則進(jìn)行匹配,顯示也顯示匹配到的第一個(gè)內(nèi)容,但是我們可以通過(guò)給group方法傳參數(shù)
# 來(lái)獲取具體文組中的內(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 只取第一個(gè)符合條件的,沒(méi)有優(yōu)先顯示這件事兒
# 得到的結(jié)果是一個(gè)變量
# 變量.group() 的結(jié)果 完全和 變量.group(0)的結(jié)果一致
# 變量.group(n) 的形式來(lái)指定獲取第n個(gè)分組中匹配到的內(nèi)容
# 加上括號(hào) 是為了對(duì)真正需要的內(nèi)容進(jìn)行提取
ret = re.findall('<\w+>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
print(ret) # --> ['askh930s02391j192agsj']
其他的內(nèi)容在代碼中有詳細(xì)的注釋?zhuān)蠹铱梢詮?fù)制我的代碼一步一步運(yùn)行然后實(shí)驗(yàn)
以下的內(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") # 默認(rèn)全部替換,當(dāng)然也可以替換一次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 這個(gè)就相當(dāng)與加了個(gè)^ (和search差不多) --> 主要用來(lái)規(guī)定這個(gè)字符號(hào)必須是什么樣的
res = re.match('\d+', 'cyx123456cyxxx')
print(res) # --> None
res = re.match('\d+', '123cyx456cyxxx')
print(res.group()) # --> 123
# compile -- 節(jié)省代碼的時(shí)間的工具
# 假如同一個(gè)正則表達(dá)式要被使用多次
# 節(jié)省了多次解析同一個(gè)正則表達(dá)式的時(shí)間
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é)省時(shí)間又節(jié)省空間呢?
ret = re.compile('\d+')
res = ret.finditer("cyx222231fddsf45746sdf2123sdf56456sdf10123sdf123132sdf")
for r in res:
print(r.group())
"""
222231
45746
2123
56456
10123
123132
"""
# 分組命名(?P<組名>正則) (?P=組名)
# 有的時(shí)候我們要匹配的內(nèi)容是包含在不想要的內(nèi)容之中的,
# 只能先把不想要的內(nèi)容匹配出來(lái),然后再想辦法從結(jié)果中去掉
# 分組命名的用法 (找兩個(gè)組里面是一樣的內(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
今日小思考
當(dāng)我們有一個(gè)這樣的列表:
lis = ['', 'z', 'c', 'asd', 'sdf', '', 'asd']
那么我們?nèi)绾螌⒗锩娴目兆址麆h除呢?
ret = filter(lambda n: n, lis)
print(list(ret)) # --> ['z', 'c', 'asd', 'sdf', 'asd']
總結(jié)
到此這篇關(guān)于正則表達(dá)式+Python re模塊詳解的文章就介紹到這了,更多相關(guān)正則表達(dá)式 python re模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
來(lái)源:腳本之家
鏈接:https://www.jb51.net/article/183375.htm
申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!