我有一个网址列表,每个网址都与一组数字相关联。例如:
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。
另一个注意事项,我说为了简单起见而映射到数字。实际上,它们被映射到一组数字,其中集合必须匹配。只是在案例中可以帮助某人提出解决方案(虽然我对此表示怀疑)。
答案 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聚类。它确实详细解释了这一点。