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