python IP地址的正则表达式验证(全段与部分)
我正在尝试验证输入,看看它是否是一个有效的IP地址(也可以是部分的IP地址)。
可以接受的输入:172,172.112,172.112.113,172.112.113.114
不可接受的输入:1724,172.11113等等
这是我创建的一个函数来检查它(不过它却能验证像1724这样的不可接受的输入,我似乎无法修复这个问题……请帮帮我)
def ipcheck(ip):
ippattern_str = '(([1-2]?[\d]{1,2}\.?){0,1}(\.[1-2]?[\d]{1,2}){0,1}(\.[1-2]?[\d]{1,2}\.){0,1}(([1-2]?[\d]{1,2}[\D\W]*)'
ippattern = re.compile(ippattern_str)
# ippattern is now used to call match, passing only the ip string
global matchip
matchip = ippattern.match(ip)
return matchip
ip = sys.argv[1]
ipcheck(ip)
print matchip
我觉得我可能需要正确使用锚点?我已经尽力尝试了所有我知道的方法,任何帮助都会很感激。
2 个回答
7
也许你可以不使用正则表达式,直接让 Python 的 socket.inet_aton 来处理这个问题:
import socket
try:
socket.inet_aton(addr)
# correct IP
except socket.error:
# bad IP
对于 inet_aton 来说,一个有效的 IP 地址应该是这样的格式:
a.b.c.d
a.b.c
a.b
a
在上面提到的所有格式中,点分地址的各个部分可以用十进制、八进制(前面加0)或十六进制(前面加0X)来表示。所有这些格式的地址统称为 IPV4 数字和点的表示法。使用恰好四个十进制数字的格式被称为 IPv4 点分十进制表示法(有时也叫 IPv4 点分四元组表示法)。
3
这个正则表达式可以解决问题:
^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){0,3}$
它确保输入的数字在正确的范围内(0到255),并且可以有1到4个部分。
你可以在这里看到它的实际效果:http://regexr.com?2va3j