正则表达式匹配域名及其顶级域名(CCTLD)

9
有没有人知道一个正则表达式来匹配域名.CCTLD?我不想要子域名,只想要“原子域名”。例如,docs.google.com不能匹配,但是google.com可以。然而,像.co.uk这样的CCTLD会让问题变得更加复杂。有没有人知道解决方案?提前感谢。
编辑:我意识到我还必须处理多个子域名,例如john.doe.google.co.uk。现在比以往任何时候都需要一个解决方案:P。

你是否需要明确使用正则表达式,还是一个函数就足够了? - Benson
这将成为一个相当大的正则表达式,因为您需要将所有ccSLD视为特殊情况,并且有很多(我是说很多)ccSLD。巴西有66个! - You
@Benson,只要在长列表中找到domain.cctld,函数就可以工作。 - Tom
可能是 从URL获取子域名 的重复问题。 - Greg Hewgill
3个回答

8
看起来你正在寻找通过Public Suffix List项目获得的信息。
“公共后缀”是互联网用户可以直接注册名称的一种。一些公共后缀的例子包括“.com”,“.co.uk”和“pvt.k12.wy.us”。公共后缀列表是所有已知公共后缀的列表。
没有单个正则表达式能够合理地匹配公共后缀列表。您需要实现代码来使用公共后缀列表,或者找到一个已经这样做的现有库。

有趣且可能非常有用的列表。 - You
1
谢谢,Greg。那绝对是正确的答案。在http://www.dkim-reputation.org/regdom-libs/上有几种语言可以进行公共后缀列表处理的库。 - Anirvan
@Anirvan,你知道Python里有相应的库吗?你发布的那个库只有C、PHP和Perl版本。 - Tom
@Tom:一年多以后,这里有一个处理任务的Python包:http://pypi.python.org/pypi/publicsuffix - Martijn Pieters

3
根据您上面的评论,我将重新解释问题 - 我们将创建一个函数来匹配它们,并将该函数应用于过滤包含一级域名(例如google.com、amazon.co.uk)的域名列表。首先,我们需要一个TLDs列表。正如Greg所提到的,公共后缀列表是一个很好的起点。假设您已经将列表解析为名为suffixes的Python数组。如果您对此不熟悉,请发表评论,我可以添加一些代码来完成它。
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

谢谢!我可以从这里找到路了。 - Tom
4
现在你可以使用一个简单但出色的Python包来完成这项繁重的工作:http://pypi.python.org/pypi/publicsuffix。 - Martijn Pieters

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

我认为如果不知道实际的顶级域名列表(即:如果您知道正则表达式是如何工作的,您总是可以构造一个看起来像顶级域名的子域名),就无法正确区分真正的双部分顶级域名和子域名。


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