在Python中验证IP地址

在Python中验证IP地址

在本教程中,我们将学习使用多种方式在Python中验证IP地址。当我们编写操作系统级别的程序时,这是非常有用的。如果我们正在开发Django或Flask中的一些Web应用程序,我们可能需要确定用户的IP地址是否有效。IP地址验证对于防止欺诈、为用户提供定位服务等方面至关重要。

让我们先简要介绍一下IP地址。

什么是IP(Internet Protocol)地址

IP代表互联网协议;它是分配给连接到互联网的每台计算机的唯一地址。它是指一组规则,用于控制数据在互联网上的传输方式的一部分。它结合了DNS解析和从一台计算机到另一台计算机的信息传输。

主要有两个版本的IP地址 – IPv4和IPv6。

IPv4 vs IPv6

IPv4地址是我们熟悉的地址。一个IPv4由四个数字(每个数字介于0和255之间)通过句点分隔而成。IP地址的格式是一个32位的数值地址,写成4个被称为(八进制)的十进制数。它提供了43亿个唯一地址的组合。

示例

32.253.431.175

IPv6

这是一个更新的版本,与上一个版本略有不同。它的样子如下所示。

3002:0bd6:0000:0000:0000:ee00:0033:6778

它使用字母和数字的组合。它将IPv4地址的可用空间数量扩大了三倍。这是一个128位的地址空间,它结合了2128个唯一地址,而IPv4只允许43亿个唯一地址。IPv6拥有IPv4的1028倍地址数量。

为什么我们需要IPv6

尽管IPv4被称为“版本4”,但它是历史上第一个创建的IP版本,从互联网诞生以来就存在。当时,工程师们无法想象43亿个IP地址不足以满足需求。到2022年,各种智能手机、笔记本电脑和平板电脑已经使用了42.9亿个地址。

如何在Python中验证IP地址

在本节中,我们将看到验证IP地址的各种方法。

方法1 – 使用count()方法

让我们了解下面的示例:

示例

def validate_ip(s):

    # check number of periods
    if s.count('.') != 3:
        return 'Invalid Ip address'

    ip_list = list(map(str, s.split('.')))

    # check range of each number between periods
    for element in ip_list:
        if int(element) < 0 or int(element) > 255 or (element[0]=='0' and len(element)!=1):
            return 'Invalid IP address'

    return 'Valid IP address'


print(validate_ip('255.1.2.2'))

输出:

Valid IP Address

解释

在上面的代码中,我们使用了 count() 方法来计算 (点) 分隔符。如果分隔符的计数少于3,则输入的IP地址无效。然后我们检查每个数的范围是否满足条件。如果满足条件,则输入的IP地址有效。

这是一个简单的验证IP地址的示例。

方法2:使用set()

让我们理解以下示例

示例

def validate_ip(s):

    # initialize count variable
    count = 0

    # check if period is present
    for i in range(0, len(s)):
        if(s[i] == '.'):
            count = count+1
    if(count != 3):
        return 0

    # check the range of numbers between periods
    set_val= set()
    for i in range(0, 256):
        set_val.add(str(i))
    count = 0
    temp = ""
    for i in range(0, len(s)):
        if(s[i] != '.'):
            temp = temp+s[i]
        else:
            if(temp in set_val):
                count = count+1
            temp = ""
    if(temp in set_val):
        count = count+1

    # verifying all conditions
    if(count == 4):
        return 'Valid Ip address'
    else:
        return 'Invalid Ip address'

print(validate_ip('110.234.52.124'))

输出:

Valid Ip address

说明-

在代码中,我们初始化了计数变量count,用于计算IP地址中“.”的个数。如果分隔符的个数小于3,表示输入的IP地址无效;如果条件成立,则将set_val初始化为一个集合。在set_val中,我们将数字作为字符串范围从0到256进行添加。之后,我们再次初始化计数变量和一个空字符串temp。for循环迭代并检查字符串是否与“.”不相等;如果条件成立,则将该字符串添加到temp中。否则,我们检查字符串是否已存在于set_val中;如果为真,则将计数增加一并清除temp。

然后我们验证计数;如果计数等于四,则表示有一个有效的IP地址。

方法3:使用ipaddress()模块

Python提供了一个有用的模块,名为 ipaddress ,可以用于验证IP地址并对IP地址执行一些基本的算术操作。它不会明确评估IP地址是否有效,但我们需要使用一些逻辑来进行评估。

它提供了确定有效IP地址的最健壮和安全的方式。它支持IPv4和IPv6地址。

要使用此模块,我们需要将其导入到Python代码中。

让我们了解以下示例。

例-

import ipaddress
def validate_ip(ip_str):
   try:
       ip_obj = ipaddress.ip_address(ip_str)
       print(f"The IP address {ip_obj} is valid")
   except ValueError:
       print(f"The IP address {ip_str} is not valid")

validate_ip("127.0.0.2.4")
validate_ip("127.0.0.0")

输出:

The IP address '127.0.0.2.4' is not valid
The IP address 127.0.0.0 is valid

使用这个模块的优点是可以验证IPv4和IPv6地址。

validate_ip("2001:0db8:75a2:0000:0000:8a2e:0340:5625")

输出:

The IP address 2001:db8:75a2::8a2e:340:5625 is valid

使用正则表达式验证IP

在这种方法中,我们将使用自定义的正则表达式来检查提供的IP字符串的格式。Python提供了re库,用于解析和匹配正则表达式。

这种方法不如ipaddress模块高效和健壮,它需要更多的代码行,并且检查字符串不仅是正确的形式,而且其中的值在0到255之间。我们还必须编写两个逻辑来检查IPv4和IPv6地址。

要验证IPv4,我们创建一个匹配IPv4地址的正则表达式字符串。让我们逐个了解以下正则表达式。

“[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}”

让我们逐个了解它的组成部分。

  • [0-9] – 表示我们正在搜索0到9之间的数字字符。
  • { 1,3} – 表示我们要查找前一个字符集的一个或多个实例。
  • \. – 它告诉解析器检查”.”字符。在正则表达式中,我们需要使用\”\\\”转义来指定我们正在寻找一个特殊字符。

这三个组成部分组成了IP地址的一个字节(例如255.)。现在我们重复这些组成部分四次。

我们需要导入re模块来在Python中使用正则表达式。接下来,我们将使用 match() 函数来检查输入与正则表达式是否匹配。

示例

import re
match = re.match(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}", "127.0.0.1")
print(match)

输出:

现在让我们实现完整的验证函数。

示例

import re
def validate_ip(ip_address):
    match = re.match(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}", ip_address)

    if not bool(match):
       print(f"The IP address {ip_address} is not valid")
       return False

    bytes = ip_address.split(".")

    for ip_byte in bytes:
       if int(ip_byte) < 0 or int(ip_byte) > 255:
           print(f"The IP address {ip_address} is not valid")
           return False
    print(f"The IP address {ip_address} is valid")
    return True

validate_ip('127.0.0.1')

输出:

The IP address 127.0.0.1 is valid

结论

在本教程中,我们学习了各种验证IP地址的方法,包括内置的ipaddress模块。我们学习了IPv4与IPv6地址的不同之处,以及为何需要IPv6地址。您可以轻松在系统上找到当前的IP地址。打开设备设置,然后打开系统偏好设置 > 网络 > 根据您的连接选择WiFi或以太网。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程