Способ группировки URL - PullRequest
       30

Способ группировки URL

0 голосов
/ 23 марта 2011

У меня есть список URL, каждый из которых связан с набором номеров.Например:

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-адресов, отсутствующих в списке, я могу предположить, что они сопоставляются с любым номером, который я хочу.

Таким образом, такой вывод - любой 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 голосов
/ 22 июля 2011

То, что вы запрашиваете, это кластеризация URL на основе веб-пути. Вы можете проверить кластеризацию K-средних текстового документа. Это объясняет это в деталях.

0 голосов
/ 23 марта 2011

Похоже, будет проще использовать разные регулярные выражения для каждого совпадения URL, возможно, они будут выглядеть примерно так.

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

Попробуйте сопоставить URL с каждым из них по порядку, затемкогда он совпадает, посмотрите номер (или набор), который соответствует этому совпадению.

В качестве альтернативы вы можете использовать одно регулярное выражение с группами захвата, чтобы определить, какой URL действительно был найден, например:

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

Вот Rubular, который показывает, как вы могли бы использовать предыдущее регулярное выражение: http://www.rubular.com/r/tklqMs8U1Z

edit : Вот функция 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
...