【问题标题】:Determine if Host is Domain Name or IP in Python确定主机是Python中的域名还是IP
【发布时间】:2015-08-18 00:32:16
【问题描述】:

Python 中是否有一个函数可以确定主机名是域名还是 IP(v4) 地址?

注意,域名可能看起来像:alex.foo.bar.com,甚至(我认为这是有效的):1.2.3.com

【问题讨论】:

  • 当您说“是主机名”时,您的意思是......“根据严格的格式是一个有效主机名”,或者“是一个公开存在的主机名DNS”或“是一个没有空格且不是 IP 地址的字符串”?
  • 我很想知道一个字符串是否是“根据严格格式的有效主机名”。我想在不访问 DNS 的情况下执行此检查。

标签: python ip-address urllib2 hostname url-parsing


【解决方案1】:

IP 和域地址之间的视觉差异之一是,当您删除 IP 地址中的点时,结果将是一个数字。因此,基于这种差异,我们可以检查输入字符串是 IP 还是域地址。我们删除输入字符串中的点,然后检查是否可以将结果转换为整数,否则会出现异常。

def is_ip(address):
    return address.replace('.', '').isnumeric()

尽管在某些 IP 表示形式中,例如点分十六进制(例如 0xC0.0x00.0x02.0xEB),IP 地址中可以同时包含字母和数字。但是,顶级域(.org、.com、...)从不包含数字。使用下面的函数将比上面的函数在更多的情况下起作用。

def is_ip(address):
    return not address.split('.')[-1].isalpha()

【讨论】:

    【解决方案2】:

    我会使用 IPy 来测试字符串是否是 IP 地址,如果不是 - 假设它是一个域名。例如:

    from IPy import IP
    def isIP(str):
        try:
            IP(str)
        except ValueError:
            return False
        return True
    

    【讨论】:

    • 请注意,IPy 拒绝某些有效的IP address representations。点分十六进制和点分八进制都失败:IP('0xC0.0x00.0x02.0xEB')IP('0300.0000.0002.0353')。当然,这些是不常用的,所以根据 OP 的需要,它可能没问题。
    猜你喜欢
    • 2016-01-08
    • 2014-09-23
    • 2010-09-09
    • 2012-04-14
    • 2019-09-29
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多