Python中如何确定主机名是域名还是IP地址

3

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

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


当你说“是主机名”时,你的意思是“根据严格格式是有效的主机名”,还是“存在于公共DNS中的主机名”,或者“没有空格且不是IP地址的字符串”? - TessellatingHeckler
我想知道一个字符串“是否符合严格格式的主机名”。 我希望在不查询DNS的情况下执行此检查。 - Alex Rothberg
2个回答

2

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()

1
我会使用IPy来测试字符串是否为IP地址,如果不是,则假定它是域名。例如:
from IPy import IP
def isIP(str):
    try:
        IP(str)
    except ValueError:
        return False
    return True

1
请注意,IPy拒绝一些有效的IP地址表示。点分十六进制和点分八进制都会失败:IP('0xC0.0x00.0x02.0xEB')IP('0300.0000.0002.0353')。当然,这些很少使用,所以根据OP的需求可能是可以接受的。 - Michael Geary
1
我认为这个库已经成熟了,很多错误都已经被修复了。我会在2022年推荐这个答案。 - Arka Mukherjee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接