有谁知道匹配 Domain.CCTLD 的正则表达式?我不想要子域,只想要“原子域”。例如,docs.google.com
不匹配,但匹配google.com
。然而,这对于诸如.co.uk
CCTLD 之类的东西变得复杂了。有谁知道解决方案?提前致谢。
编辑:我意识到我还必须处理多个子域,例如john.doe.google.co.uk
. 现在比以往任何时候都更需要解决方案:P。
听起来您正在寻找可通过Public Suffix List项目获得的信息。
“公共后缀”是互联网用户可以直接注册姓名的后缀。公共后缀的一些示例是“.com”、“.co.uk”和“pvt.k12.wy.us”。公共后缀列表是所有已知公共后缀的列表。
没有一个正则表达式可以合理地匹配公共后缀列表。您将需要实现代码以使用公共后缀列表,或者找到已经这样做的现有库。
根据您上面的评论,我将重新解释这个问题——我们将创建一个匹配它们的函数,而不是创建一个匹配它们的正则表达式,并应用该函数来过滤域名列表包括一流的域,例如 google.com、amazon.co.uk。
首先,我们需要一个 TLD 列表。正如 Greg 所提到的,公共后缀列表是一个很好的起点。假设您已将列表解析为一个名为suffixes
. 如果这不是您喜欢的,请发表评论,我可以添加一些代码来完成它。
suffixes = parse_suffix_list("suffix_list.txt")
现在我们需要识别给定域名是否与模式 some-name.suffix 匹配的代码:
def is_domain(d):
for suffix in suffixes:
if d.endswith(suffix):
# Get the base domain name without suffix
base_name = d[0:-(suffix.length + 1)]
# If it contains '.', it's a subdomain.
if not base_name.contains('.'):
return true
# If we get here, no matches were found
return false
我可能会通过获取完整的 TLD 列表并使用它来创建正则表达式来解决这个问题。例如(在 Ruby 中,抱歉,还不是 Pythonista):
tld_alternation = ['\.com','\.co\.uk','\.eu','\.org',...].join('|')
regex = /^[a-z0-9]([a-z0-9\-]*[a-z0-9])?(#{tld_alternation})$/i
我认为在不知道实际 TLD 列表的情况下,不可能正确区分真正的两部分 TLD 和子域(即:如果您知道正则表达式的工作原理,您总是可以构建一个看起来像 TLD 的子域。)