8

有谁知道匹配 Domain.CCTLD 的正则表达式?我不想要子域,只想要“原子域”。例如,docs.google.com不匹配,但匹配google.com。然而,这对于诸如.co.ukCCTLD 之类的东西变得复杂了。有谁知道解决方案?提前致谢。

编辑:我意识到我还必须处理多个子域,例如john.doe.google.co.uk. 现在比以往任何时候都更需要解决方案:P。

4

3 回答 3

8

听起来您正在寻找可通过Public Suffix List项目获得的信息。

“公共后缀”是互联网用户可以直接注册姓名的后缀。公共后缀的一些示例是“.com”、“.co.uk”和“pvt.k12.wy.us”。公共后缀列表是所有已知公共后缀的列表。

没有一个正则表达式可以合理地匹配公共后缀列表。您将需要实现代码以使用公共后缀列表,或者找到已经这样做的现有库。

于 2010-07-07T22:23:45.553 回答
3

根据您上面的评论,我将重新解释这个问题——我们将创建一个匹配它们的函数,而不是创建一个匹配它们的正则表达式,并应用该函数来过滤域名列表包括一流的域,例如 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
于 2010-07-08T21:41:39.417 回答
2

我可能会通过获取完整的 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 的子域。)

于 2010-07-07T22:32:23.363 回答