kos*_*tmo 24 python regex validation hostname fqdn
跟随正则表达式匹配主机名或IP地址? 并使用有效主机名的限制作为参考,在Python中匹配/验证主机名/ fqdn(完全限定域名)的最可读,最简洁的方法是什么?我已经回答了下面的尝试,欢迎改进.
Tim*_*ker 48
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("."))
Run Code Online (Sandbox Code Playgroud)
确保每个细分
它也避免了双重否定(not disallowed
),如果hostname
以a结尾.
,那也没关系.如果hostname
以多个点结束,它将(并且应该)失败.
这是Tim Pietzcker 答案的更严格版本,并进行了以下改进:
[0-9]
而不是\d
)。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)
Run Code Online (Sandbox Code Playgroud)
不要重新发明轮子。您可以使用库,例如验证器。或者你可以复制他们的代码:
pip install validators
Run Code Online (Sandbox Code Playgroud)
import validators
if validators.domain('example.com')
print('this domain is valid')
Run Code Online (Sandbox Code Playgroud)
根据The Old New Thing,DNS名称的最大长度为253个字符。(一个最多允许255个八位位组,但其中两个被编码占用。)
import re
def validate_fqdn(dn):
if dn.endswith('.'):
dn = dn[:-1]
if len(dn) < 1 or len(dn) > 253:
return False
ldh_re = re.compile('^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$',
re.IGNORECASE)
return all(ldh_re.match(x) for x in dn.split('.'))
Run Code Online (Sandbox Code Playgroud)
可以根据自己的目的主张是否接受空域名。
归档时间: |
|
查看次数: |
37363 次 |
最近记录: |