ip位址是用3個'.'號作為分隔符,分割4個數字,每個數字的取值在[0,255],一般日誌檔案中的ip位址都是有效的ip位址,不需要我們再去驗證,因此,若從日誌檔案中提取ip,那麼可以簡單寫成這樣:
>>> import re
>>> s='kkk 192.168.1.136 kkk 192.168.1.137 kk 192.168.1.138 kk'
>>> l=re.findall(r'\d+.\d+.\d+.\d+', s)
>>> print l
['192.168.1.136', '192.168.1.137', '192.168.1.138']
如果s中的ip位址有可能是無效的,那我們就需要在匹配的過程中,增加判斷是否有效的操作,
下面的匹配方法可以驗證數字的大小:>>> s='kkk 192,168,1,136 kkk 192.168.1.137 kk 192.168.1.138 kk' #第乙個ip位址以','作為分隔符,這是無效的ip位址
>>> l=re.findall(r'\d+.\d+.\d+.\d+', s)# '.'能夠匹配除了'\n'之外的任意乙個字元(因此'.'可以匹配上',')
>>> print l
['192,168,1,136', '192.168.1.137', '192.168.1.138'] #顯然,第乙個ip位址無效
>>> l=re.findall(r'\d+\.\d+\.\d+\.\d+',s) # '\.'可以精確的匹配'.'
>>> print l
['192.168.1.137', '192.168.1.138']
>>> s='kkk 192.168.1.336 kkk 192.168.1.137 kk 192.168.1.138 kk'
>>> l=re.findall(r'\d+\.\d+\.\d+\.\d+',s) #並沒有驗證每個數字的大小,導致第乙個錯誤的ip位址也匹配上了
>>> print l
['192.168.1.336', '192.168.1.137', '192.168.1.138'] #第乙個ip位址是無效的,但錯誤的匹配上了
>>> s='kkk 192.288.1.136 kkk 192.168.1.137 kk 192.168.1.138 kk'
>>> l=re.findall(r'(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)',s)
>>> print l
['192.168.1.137', '192.168.1.138']
#或者這樣:
>>> l=re.findall(r'(?:(?:25[0-5]|2[0-4]\d|[01]?[0-9][0-9]?)\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)',s)
>>> print l
['192.168.1.137', '192.168.1.138']
>>> s='kkk 192.137.1.336 kkk 1192.168.1.137 kk 192.168.1.138 kk' #第乙個和第二個ip位址都無效,不應該匹配出來
>>> l=re.findall(r'(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)',s)
>>> print l
['192.137.1.33', '192.168.1.137', '192.168.1.138']#擷取了第乙個和第二個ip位址的一部分
>>> s='kkk 192.137.1.336 kkk 1192.168.1.137 kk 192.168.1.138 kk'
>>> l=re.findall(r'\b(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b',s)
>>> l
['192.168.1.138']
>>> l=re.findall(r'\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b',s)
>>> l
['192.168.1.138']
# '\b'表示符合要求的子串的第乙個字元的前面和最後乙個字元的後面不可以是'\w'字元(不可以是大小字母,數字,下劃線)
#上述版本比較常用,但也存在一點問題:
>>> s='kkk 192.137.1.336 kkk 192.168.1.137.123 kk 192.168.1.138 kk'
#第二個ip位址以'.'號作為分隔符,且每個數字在[0,255]之間,但該ip位址無效(多了乙個數字)!!
>>> l=re.findall(r'\b(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b',s)
>>> print l
['192.168.1.137', '192.168.1.138'] #將第二個ip位址,擷取了前4個數字,但顯然第二個ip位址本應是無效的!!
這種情況可這樣解決,使用常用版本2:
綜上所述:>>> s='kkk 192.137.1.336 kkk 192.168.1.137.123 kk 192.168.1.138 kk'
>>> l=re.findall(r'(?>> print l
['192.168.1.138'] #準確的提取了ip位址!
1》若從日誌檔案中提取ip,那麼可以簡單寫成這樣:
re.findall(r'\d+\.\d+\.\d+\.\d+',s) # 適用於不需要驗證ip位址的場合
#2.1>
re.findall(r'\b(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b',s)
#或:re.findall(r'\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.)(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b',s)
#2.2>
re.findall(r'(?
python正則匹配ip位址
用正則匹配ip位址 可以將ip位址按區間分類 0 99 1 9 d 表示十位數有1個或無 100 199 1 d 200 249 2 0 5 d 250 255 25 0 5 前面三位ip都帶.讓他們擴張三次。最後一位ip不帶.再來一次 import re g se215.255.255.155 5...
匹配IP位址
正規表示式 25 0 5 2 0 4 0 9 0 1 0 9 1 9 0 9 1 9 25 0 5 2 0 4 0 9 0 1 0 9 1 9 0 9 1 9 0 25 0 5 2 0 4 0 9 0 1 0 9 1 9 0 9 1 9 0 25 0 5 2 0 4 0 9 0 1 0 9 1 9 ...
IP位址匹配
問題描述 在路由器中,一般來說 模組採用最大字首匹配原則進行目的埠查詢,具體如下 ip位址和子網位址所帶掩碼做and運算後,得到的值與子網位址相同,則該ip位址與該子網匹配。比如 192.168.1.100 255.255.255.0 192.168.1.0,則該ip和子網192.168.1.0匹配...