一种分组URL的方法

时间:2011-03-23 16:00:58

标签: regex url cluster-analysis

我有一个网址列表,每个网址都与一组数字相关联。例如:

http://example.com/ - 0
http://example.com/login/ - 1
http://example.com/login/verify/ - 2
http://example.com/user123/home/ - 3
http://example.com/user254/home/ - 3
http://example.com/user123/edit/ - 4

我想要一些方法'压缩'这个,也许使用正则表达式 - 问题是对于列表中没有的所有网址,我可以假设它们映射到我想要的任何数字。

这样的输出 - 按照此顺序中的每个表达式检查任何URL,并根据第一个匹配给出一个数字。

http://example.com/login/verify* - 2
http://example.com/login/* - 1
http://example.com/*/home/ - 3
http://example.com/*/edit - 4
http://example.com/* - 0

注意: 有多种可能的输出是可以接受的。此外,我考虑过像树一样的东西,其中每个节点都包含一个类似上面的表达式,最后的叶子是要检查的实际URL。

另一个注意事项,我说为了简单起见而映射到数字。实际上,它们被映射到一组数字,其中集合必须匹配。只是在案例中可以帮助某人提出解决方案(虽然我对此表示怀疑)。

2 个答案:

答案 0 :(得分:0)

看起来每个网址匹配使用不同的正则表达式最简单,它们可能看起来像这样。

http://example\.com/login/verify
http://example\.com/login
http://example\.com/[^/]+/home
http://example\.com/[^/]+/edit
http://example\.com

尝试按顺序将URL与每个URL匹配,然后在匹配时查找与该匹配对应的数字(或集)。

或者,您可以使用单个正则表达式捕获组来确定实际匹配的URL,例如:

http://example\.com(?:(/login/verify)|(/login)|(/[^/]+/home)|(/[^/]+/edit))?

这是一个Rubular,展示了如何使用以前的正则表达式: http://www.rubular.com/r/tklqMs8U1Z

编辑:这是一个Python函数,可以完成我认为您正在寻找的内容。

import re

def url_match(url):
    base = "http://example.com"
    endings = [("/login/verify", 2), ("/login", 1), ("/*/home", 3), ("/*/edit", 4), ("", 0)]
    re_endings = ["(%s)" % re.escape(x[0]).replace(r"\*", "[^/]+") for x in endings]

    pattern = re.compile("%s(?:%s)" % (re.escape(base), "|".join(re_endings)))
    match = pattern.match(url)

    if match is None:
        return None

    index = [i for i, x in enumerate(match.groups()) if x is not None]
    return endings[index[0]][1]

url_match("http://example.com")              # 0
url_match("http://example.com/login")        # 1
url_match("http://example.com/login/verify") # 2
url_match("http://example.com/user123/home") # 3
url_match("http://example.com/user123/edit") # 4
url_match("http://sample.com")               # None

答案 1 :(得分:0)

您要求的是基于Web路径的URL聚类。您可以查看文本文档的K-means聚类。它确实详细解释了这一点。