[英]Using a RegEx to match IP addresses
我正在嘗試進行測試以檢查 sys.argv 輸入是否與 IP 地址的 RegEx 匹配...
作為一個簡單的測試,我有以下...
import re
pat = re.compile("\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}")
test = pat.match(hostIP)
if test:
print "Acceptable ip address"
else:
print "Unacceptable ip address"
但是,當我將隨機值傳遞給它時,它在大多數情況下返回“可接受的 IP 地址”,除非我有一個基本上等同於\d+
的“地址”。
使用正則表達式來驗證 IP 地址是一個壞主意 - 這將通過 999.999.999.999 作為有效。 嘗試使用套接字代替這種方法 - 更好的驗證和同樣簡單,如果不是更容易的話。
import socket
def valid_ip(address):
try:
socket.inet_aton(address)
return True
except:
return False
print valid_ip('10.10.20.30')
print valid_ip('999.10.20.30')
print valid_ip('gibberish')
如果你真的想使用解析主機方法,這段代碼將完全做到:
def valid_ip(address):
try:
host_bytes = address.split('.')
valid = [int(b) for b in host_bytes]
valid = [b for b in valid if b >= 0 and b<=255]
return len(host_bytes) == 4 and len(valid) == 4
except:
return False
您必須按以下方式修改正則表達式
pat = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
那是因為.
是代表“每個字符”的通配符
ip v4 的正則表達式:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
否則,您將使用無效的 IP 地址,例如 999.999.999.999、256.0.0.0 等
我遇到了同樣的情況,我發現使用套接字庫的答案很有幫助,但它不提供對 ipv6 地址的支持。 找到了更好的方法:
不幸的是,它僅適用於 python3
import ipaddress
def valid_ip(address):
try:
print (ipaddress.ip_address(address))
return True
except:
return False
print (valid_ip('10.10.20.30'))
print (valid_ip('2001:DB8::1'))
print (valid_ip('gibberish'))
您正在嘗試使用 . 作為一個 。 不能作為任何字符的通配符。 使用\\.
而是表示一個時期。
def ipcheck():
# 1.Validate the ip adderess
input_ip = input('Enter the ip:')
flag = 0
pattern = "^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$"
match = re.match(pattern, input_ip)
if (match):
field = input_ip.split(".")
for i in range(0, len(field)):
if (int(field[i]) < 256):
flag += 1
else:
flag = 0
if (flag == 4):
print("valid ip")
else:
print('No match for ip or not a valid ip')
import re
ipv=raw_input("Enter an ip address")
a=ipv.split('.')
s=str(bin(int(a[0]))+bin(int(a[1]))+bin(int(a[2]))+bin(int(a[3])))
s=s.replace("0b",".")
m=re.search('\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}$',s)
if m is not None:
print "Valid sequence of input"
else :
print "Invalid input sequence"
為了簡單起見,我使用了這種方法。 簡單地解釋如何評估真正的 ipv4 地址。 盡管不需要檢查其是否為二進制數。 希望你喜歡這個。
str = "255.255.255.255"
print(str.split('.'))
list1 = str.split('.')
condition=0
if len(list1)==4:
for i in list1:
if int(i)>=0 and int(i)<=255:
condition=condition+1
if condition!=4:
print("Given number is not IP address")
else:
print("Given number is valid IP address")
如果你真的想使用 RegExs,下面的代碼可能會過濾文件中無效的 ip 地址,無論文件的組織如何,每行一個或多個,即使有更多的文本(RegExs 的概念本身):
def getIps(filename):
ips = []
with open(filename) as file:
for line in file:
ipFound = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$").findall(line)
hasIncorrectBytes = False
try:
for ipAddr in ipFound:
for byte in ipAddr:
if int(byte) not in range(1, 255):
hasIncorrectBytes = True
break
else:
pass
if not hasIncorrectBytes:
ips.append(ipAddr)
except:
hasIncorrectBytes = True
return ips
re.sub('((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])', '--', '127.0.0.1')
使用這個正則表達式,只有從 0 到 255 的數字可以組成地址。 它還處理前導零,因此127.00.0.1
不會通過。
IP 地址使用以下身份驗證:
9 ---> 1-9
import re k = 0 while k < 5 : i = input("\\nEnter Ip address : ") ip = re.match("^([1][0-9][0-9].|^[2][5][0-5].|^[2][0-4][0-9].|^[1][0-9][0-9].|^[0-9][0-9].|^[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9]|[2][5][0-5]|[2][0-4][0-9]|[1][0-9][0-9]|[0-9][0-9]|[0-9])$",i) k = k + 1 if ip: print ("\\n=====================") print ("Valid IP address") print ("=====================") break else : print ("\\nInvalid IP") else : print ("\\nAllowed Max 5 times")
如果您有疑問,請回復我?
import re
st1 = 'This is my IP Address10.123.56.25 789.356.441.561 127 255 123.55 192.168.1.2.3 192.168.2.2 str1'
這里我的有效 IP 地址只有192.168.2.2
並且假設10.123.56.25
是無效的,因為它與一些字符串組合並且192.168.1.2.3
無效。
pat = r'\s(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\s|$))'
match = re.search(pat,st1)
print match.group()
================ RESTART: C:/Python27/Srujan/re_practice.py ================
192.168.2.2
這將 grep 確切的 IP 地址,我們可以忽略任何看起來像 IP 地址但不是有效地址的模式。 例如: 'Address10.123.56.25', '789.356.441.561' '192.168.1.2.3'
。
如果需要修改,請評論。
這適用於 python 2.7:
import re
a=raw_input("Enter a valid IP_Address:")
b=("[0-9]+"+".")+"{3}"
if re.match(b,a) and b<255:
print "Valid"
else:
print "invalid"
""" 用於查找有效 IP 地址的正則表達式 """
import re
IPV4 = re.fullmatch('([0-2][0-5]{2}|\d{2}|\d).([0-2][0-5]{2}|\d{2}|\d).([0-2][0-5]{2}|\d{2}|\d).([0-2][0-5]{2}|\d{2}|\d)', '100.1.1.2')
if IPV4:
print ("Valid IP address")
else:
print("Invalid IP address")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.