Как найти доменное имя по ссылке?

Рейтинг: 0Ответов: 3Опубликовано: 20.04.2023

Пытаюсь с помощью регулярных строк найти доменные имена по ссылкам. На каких-то ссылках корректно работает, а где-то нет.

Пример:
Есть ссылка
https://ru.stackoverflow.com/questions/ask

Мне нужно найти доменное имя:

https://ru.stackoverflow.com/

Я использую следующее регулярное выражение:

.*[://].*[/]{1}

Но код почему-то находит мне вот эту часть -

https://ru.stackoverflow.com/questions/

Хотя при использовании других ссылок всё работает как положено.
Ссылка

https://vc.ru/new

Что нашёл по регулярной строке -

 https://vc.ru/

Проблема в том, что какие-то ссылки корректно обрабатываются, а какие-то нет. В чём проблема?

P.S. В ответах на форуме не нашёл подходящего вопроса. Только поиск домена без https/http. Мне нужен поиск вместе с протоколом

Ответы

▲ 3Принят

Используйте "ленивый" квантификатор .+? и удалите ненужные квадратные скобки

import re

for txt in ['https://ru.stackoverflow.com/questions/ask', 'https://vc.ru/new','ftp://public.ftp-servers.example.com/mydirectory/myfile.txt']:
    print(re.search(r'.*://.+?/', txt)[0])
https://ru.stackoverflow.com/
https://vc.ru/
ftp://public.ftp-servers.example.com/
▲ 2

А почему бы не использовать стандартные библиотеки для парсинга url?

from urllib.parse import urlparse, urlunparse, ParseResult

url = urlparse('https://ru.stackoverflow.com/questions/ask')
print(url)
print(urlunparse(ParseResult(url.scheme, url.netloc, '', '', '', '')))

Вывод:

ParseResult(scheme='https', netloc='ru.stackoverflow.com', path='/questions/ask', params='', query='', fragment='')
https://ru.stackoverflow.com
▲ 0
'/'.join(f"{url}/".split('/', 3)[:-1])