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