首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证主机名字符串

验证主机名字符串
EN

Stack Overflow用户
提问于 2010-03-28 13:58:53
回答 10查看 52.9K关注 0票数 29

跟随Regular expression to match hostname or IP Address?并使用Restrictions on valid host names作为参考,在Python中匹配/验证主机名/fqdn(完全限定域名)的最易读、最简洁的方法是什么?我已经在下面用我的尝试回答了,欢迎改进。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-03-28 16:52:51

代码语言:javascript
复制
import re
def is_valid_hostname(hostname):
    if len(hostname) > 255:
        return False
    if hostname[-1] == ".":
        hostname = hostname[:-1] # strip exactly one dot from the right, if present
    allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
    return all(allowed.match(x) for x in hostname.split("."))

确保每个数据段

允许的characters

  • doesn't开始或结束字符至少包含一个字符,最多63个字符。

它还避免了双重否定(not disallowed),如果hostname.结尾,也没问题。如果hostname以多个点结束,它将(也应该)失败。

票数 53
EN

Stack Overflow用户

发布于 2020-01-28 21:13:36

不要重复发明轮子。您可以使用库,例如验证器。或者,您可以复制their code

安装

代码语言:javascript
复制
pip install validators

用法

代码语言:javascript
复制
import validators
if validators.domain('example.com')
    print('this domain is valid')
票数 12
EN

Stack Overflow用户

发布于 2015-10-19 20:29:14

这是一个更严格的Tim Pietzcker's answer版本,有以下改进:

  • 将主机名的长度限制为253个字符(在剥离可选的尾随点之后)。
  • 将字符集限制为ASCII码(即,使用[0-9]而不是\d).
  • Check表示
  • 不是全数字。

代码语言:javascript
复制
import re

def is_valid_hostname(hostname):
    if hostname[-1] == ".":
        # strip exactly one dot from the right, if present
        hostname = hostname[:-1]
    if len(hostname) > 253:
        return False

    labels = hostname.split(".")

    # the TLD must be not all-numeric
    if re.match(r"[0-9]+$", labels[-1]):
        return False

    allowed = re.compile(r"(?!-)[a-z0-9-]{1,63}(?<!-)$", re.IGNORECASE)
    return all(allowed.match(label) for label in labels)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2532053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档