1. 程式人生 > >正則表示式——IP地址的匹配

正則表示式——IP地址的匹配

我在中國大學MOOC上學習正則表示式的時候,在學習IP地址的匹配的時候,發現了視訊裡的匹配IP地址的正則表示式是錯誤的 IPV0地址分四段,每段數字範圍為0-255,段與段之間用英文句點'.'隔開 其中, 250-255: 特點:三位數,百位數是2,十位是5,個位是0-5,用正則表示式可以寫成:25[0-5] 200-249: 特點:三位數,百位數是2,十位是0-4,個位是0-9,用正則表示式可以寫成:2[0-4]\d 100-199:特點: 三位數,百位數是1,十位,個位是0-9,用正則表示式可以寫成:1\d{2} 10-99:特點:二位數,十位是1-9,個位數0-9,用正則表示式可以寫成:[1-9]\d 0-9:特點:一位數,用正則表示式可以寫成:\d 綜上:可以將0-99的正則表示式寫成:[1-9]?\d (?表示前一個字元0次或1次擴充套件) 以上,視訊裡還是正確的,但是其正則表示式是這樣的: (([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5])
我們分解來看 ([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]),這一部分是說匹配數字0-255,咋看起來沒錯,但是因為最先開始的匹配擁有最高的優先權,也就是說,對於202.204.80.112這樣的,先匹配的是2而不是202 其次,該表示式中的 . 意味著匹配所有單個字元,這也就說明即使把IP改成202$204$80$112他也會匹配成功,這明顯是不對的 將上述正則表示式驗證一下: 他只能匹配到202.204;因為他首先匹配了2接著把0作為單個字元匹配,同理是2. 接著是20 最後是匹配了4(正好是四組) 只需要將正則表示式改成這樣: ((1\d{2}|25[0-5]|2[0-4]\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)
問題即可解決。 程式碼如下: import re right=r'((1\d{2}|25[0-5]|2[0-4]\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)' n=re.search(right,'202.204.80.112') print(n.group(0)) #輸出:202.204.80.112