Это единственный правильный способ анализа URL с помощью регулярного выражения:
Это на C ++, но вы найдете тривиальное преобразование в python, удалив дополнительные \. И с перечислением для захватов.
Также см. RFC3986 как исходный источник для регулярного выражения.
static const char* const url_regex[] = {
/* RE_URL */
"^(([^:/?#]+):)?(//([^/?#]*)|///)?([^?#]*)(\\?[^#]*)?(#.*)?",
};
enum {
URL = 0,
SCHEME_CLN = 1,
SCHEME = 2,
DSLASH_AUTH = 3,
AUTHORITY = 4,
PATH = 5,
QUERY = 6,
FRAGMENT = 7
};