import re
text = open("art.txt", "rt").read() # текст для обработки
host_dict = {} # инициализация словаря. Ключ - хост,
 значение - список URL
def save_url(match):
"""
Обработчик замены. Получает match-объект,
 возвращает строку
для замены найденной подстроки. Сохраняет
 данные в host_dict.
"""
# хост берется из первых скобок, URL — все соответствие
host, url = match.group(1), match.group()
if host_dict.has_key(host): # если хост уже в словаре
host_dict[host].append(url) # добавим еще
 один URL в список
else:
host_dict[host] = [url] # иначе создаем новый список
return match.group()
# скомпилируем регулярное выражение для URL (не идеальное!)
url_re = re.compile("""[a-z]+://([^/?:# ()
]+)(:d+)?
[^?#() 
]*(?[^# 
]*)?(#[^ 
]*)?""")
# производим поиск-замену в тексте
url_re.sub(save_url, text)
# берем список ключей и значений словаря. Элемент
# списка - кортеж (хост, URL-ссылки)
hosts_and_urls = host_dict.items()
# сортируем
hosts_and_urls.sort()
# циклы вывода хостов и относящихся к ним URL
for (host, urls) in hosts_and_urls:
print host + ":"
for url in urls:
print " "*4 + url