python如何利用re模塊正則表達(dá)式匹配ip地址
python中利用正則表達(dá)式判斷ipv4地址是否合法
ip地址的范圍為0.0.0.0-255.255.255.255,分成四段,則每段的范圍都是0-255,因此,以一段進(jìn)行分析:
在進(jìn)行書寫匹配規(guī)則時(shí),可以將每段的取值分為4個(gè)區(qū)間。即0-99、100-199、200-249、250-255。
其正則匹配的表達(dá)式應(yīng)為:
# 匹配 0-255的表達(dá)式書寫方法pattern = re.compile(r'([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])') # 匹配 0-255的表達(dá)式書寫方法 pattern = re.compile(r'([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])')
以下作具體解釋
- 0-99:[1-9]?\d
問(wèn)號(hào)(?)表示匹配0或1次,此表達(dá)式可以匹配0-99內(nèi)任意是數(shù)值。
- 100-199:1\d\d
第一位為1,第二位和第三位為0-9之間的任意數(shù)值。
- 200-249:2[0-4]\d
200-249范圍內(nèi),第一位固定為2,第二位取值范圍為[0-4],第三位為0-9之間任意數(shù)字,使用’\d’進(jìn)行匹配。
- 250-255:25[0-5]
250-255范圍內(nèi),前兩位固定為25,最后一位取值為[0-5]。
使用 | 符號(hào),將四部分連接起來(lái),即是一條完整的匹配0-255范圍的表達(dá)式:([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])
此時(shí)應(yīng)該已經(jīng)能夠理解,如何進(jìn)行一段ip地址的匹配,再講解如何匹配完整的ip地址。
簡(jiǎn)單理解就是(0-255).(0-255).(0-255).(0-255)。使用四段相同的表達(dá)式,并在四段表達(dá)式之間增加3個(gè)點(diǎn)(.)。
可將前三段ip值和三個(gè)點(diǎn)看作三部分,即每部分為(0-255).。
(0-255).的匹配表達(dá)式可書寫為(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.),此表達(dá)式需要使用三次,因此可以寫成 (([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}
最終,匹配0.0.0.0-255.255.255.255的表達(dá)式如下所示:
# 匹配 0.0.0.0-255.255.255.255的表達(dá)式書寫方法 pattern = re.compile(r'(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])')
下面作幾個(gè)測(cè)試用例(使用fullmatch)
In [1]: pattern.fullmatch('0.123.12.23') Out[1]: <re.Match object; span=(0, 11), match='0.123.12.23'> In [2]: pattern.fullmatch('192.168.0.1') Out[2]: <re.Match object; span=(0, 11), match='192.168.0.1'> In [3]: pattern.fullmatch('255.255.255.255') Out[3]: <re.Match object; span=(0, 15), match='255.255.255.255'> # 以上三個(gè)ip都屬于正常ip,因此能夠正確匹配 # ----------------------------------------------- # 以下兩個(gè)示例不是正確的ip,所以匹配不到,無(wú)輸出結(jié)果 In [4]: pattern.fullmatch('255.255.255.256') In [5]: pattern.fullmatch('1255.255.255.255')
再使用search、match方法對(duì)以上兩個(gè)錯(cuò)誤ip進(jìn)行匹配測(cè)試。
In [11]: pattern.search('255.255.255.256') Out[11]: <re.Match object; span=(0, 14), match='255.255.255.25'> # 匹配結(jié)果為 255.255.255.25 In [12]: pattern.search('1255.255.255.255') Out[12]: <re.Match object; span=(1, 15), match='255.255.255.25'> # 匹配結(jié)果為 255.255.255.25 In [13]: pattern.match('255.255.255.256') Out[13]: <re.Match object; span=(0, 14), match='255.255.255.25'> # 匹配結(jié)果為 255.255.255.25 In [14]: pattern.match('1255.255.255.255') # 無(wú)輸出結(jié)果 # ----------------------------------- # 請(qǐng)注意觀察以下示例的匹配結(jié)果 In [15]: pattern.search('257.127.0.0.1') Out[15]: <re.Match object; span=(1, 11), match='57.127.0.0'> In [16]: pattern.search('255.255.255.122.256') Out[16]: <re.Match object; span=(0, 15), match='255.255.255.122'>
為何會(huì)出現(xiàn)上述結(jié)果?首先對(duì)于search、match、fullmatch進(jìn)行一個(gè)對(duì)比:
方法 | 解釋 |
---|---|
search | 只匹配一次,查找整個(gè)字符串 |
match | 只匹配一次,從開頭開始匹配 |
fullmatch | 對(duì)字符串進(jìn)行完整匹配 |
由于search匹配時(shí),會(huì)查找整個(gè)字符串,然后返回滿足表達(dá)式的結(jié)果。
所以使用search方法進(jìn)行匹配時(shí),對(duì)于ip的第一個(gè)字段和最后一個(gè)字段出錯(cuò)的情況下,會(huì)自動(dòng)進(jìn)行ip址的截取,盡量使結(jié)果滿足表達(dá)式的要求,但是這種結(jié)果并不是我們想要的。
match
是從頭開始匹配,當(dāng)ip地址的前三段都正確,而最后一個(gè)字段出錯(cuò)時(shí),也無(wú)法得出預(yù)期的結(jié)果。fullmatch
是完全匹配,因此字符串要完全滿足ip地址規(guī)則時(shí),才會(huì)返回正確結(jié)果,ip地址有誤時(shí),無(wú)輸出(輸出為None)。
當(dāng)然,非要使用search和match進(jìn)行匹配也是可以的,首先了解一下“零寬斷言”。
零寬斷言
用于查找特定內(nèi)容之前或之后的內(nèi)容,但并不包括特定內(nèi)容本身(零寬)。
類似于^、 $、 \b一樣的作用,指定某一位置需要滿足某些條件(斷言)。
表達(dá)式 | 說(shuō)明 |
---|---|
(?=exp) | 匹配exp前面的位置 (此位置后面是exp) |
(?<=exp) | 匹配exp后面的位置(此位置前面是exp) |
(?!exp) | 此位置后面不能是exp |
(?<!exp) | 此位置前面不能是exp |
匹配ip地址時(shí),不允許對(duì)不合法的地址進(jìn)行截取 以得到符合規(guī)則的ip地址,即是要求:匹配結(jié)果在原字符串中的位置之前和之后不能有被截取的點(diǎn)(.)和數(shù)字。
根據(jù)以上分析 修改原有正則表達(dá)式,在原表達(dá)式的前面添加(?<![\.\d]),最后面添加(?![\.\d]),即修改之后完整的表達(dá)式為:
pattern = re.compile(r'(?<![\.\d])(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(?![\.\d])')
通過(guò)上面這條正則表達(dá)式,對(duì)之前錯(cuò)誤的ip地址重新進(jìn)行匹配驗(yàn)證,
結(jié)果如下:
In [1]: import re In [2]: pattern = re.compile(r'(?<![\.\d])(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(?![\.\d])') # 以下各語(yǔ)句執(zhí)行后都無(wú)輸出結(jié)果,說(shuō)明正則匹配不成功,ip地址不合法 In [11]: pattern.search('255.255.255.256') In [12]: pattern.search('1255.255.255.255') In [13]: pattern.match('255.255.255.256') In [14]: pattern.match('1255.255.255.255') In [15]: pattern.search('257.127.0.0.1') In [16]: pattern.search('255.255.255.122.256')
總結(jié)
以上就是在python中如何利用re模塊判斷ip地址是否合法的介紹。
僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中collections.Counter()的具體使用
本文主要介紹了Python中collections.Counter()的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Python實(shí)現(xiàn)曲線點(diǎn)抽稀算法的示例
本篇文章主要介紹了Python實(shí)現(xiàn)曲線點(diǎn)抽稀算法的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Python 通過(guò)監(jiān)聽(tīng)端口實(shí)現(xiàn)唯一腳本運(yùn)行方式
這篇文章主要介紹了Python 通過(guò)監(jiān)聽(tīng)端口實(shí)現(xiàn)唯一腳本運(yùn)行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05使用tensorflow根據(jù)輸入更改tensor shape
這篇文章主要介紹了使用tensorflow根據(jù)輸入更改tensor shape,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06使用Python實(shí)現(xiàn)Excel文件轉(zhuǎn)換為SVG格式
SVG(Scalable Vector Graphics)是一種基于XML的矢量圖像格式,這種格式在Web開發(fā)和其他圖形應(yīng)用中非常流行,提供了一種高效的方式來(lái)呈現(xiàn)復(fù)雜的矢量圖形,本文將介紹如何使用Python轉(zhuǎn)換Excel文件為SVG格式,需要的朋友可以參考下2024-07-07Python實(shí)現(xiàn)從網(wǎng)絡(luò)攝像頭拉流的方法分享
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)從網(wǎng)絡(luò)攝像頭拉流的幾種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-01-01Python使用pyfinance包進(jìn)行證券收益分析
在查找如何使用Python實(shí)現(xiàn)滾動(dòng)回歸時(shí),發(fā)現(xiàn)一個(gè)很有用的量化金融包——pyfinance。顧名思義,pyfinance是為投資管理和證券收益分析而構(gòu)建的Python分析包,主要是對(duì)面向定量金融的現(xiàn)有包進(jìn)行補(bǔ)充,如pyfolio和pandas等。pyfinance包含六個(gè)模塊,下面將一一介紹2021-11-11python執(zhí)行等待程序直到第二天零點(diǎn)的方法
這篇文章主要介紹了python執(zhí)行等待程序直到第二天零點(diǎn)的方法,涉及Python等待程序的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-04-04