✅ Решения заданий

⚠️ Рекомендация: попробуйте решить задания самостоятельно, прежде чем смотреть ответы. Решения — это последняя инстанция, когда собственные попытки исчерпаны.

⚡ Кратко

  • HTML-теги удаляются через re.sub(r"<.*?>", "", text).
  • IP-трекер хранит множество адресов в замыкании и возвращает его длину.
  • Ответы на тест: 1-b, 2-b, 3-b, 4-b, 5-b, 6-b, 7-c, 8-a, 9-a, 10-пропущены скобки, 11-1d/2a/3c/4b.

Ответы на тестовые вопросы

ВопросОтветПояснение
1b\d+\.\d+ ищет группу «одна или более цифр, точка, одна или более цифр».
2bID\d{2,4} берёт от 2 до 4 цифр; последний фрагмент ID78910 обрезается до 4 цифр.
3b[^a-zA-Z]+ исключает все буквы. \D+ исключает цифры, \W+ — словесные символы, [^\s]+ — пробелы.
4b\B означает «не граница слова».
5bre.compile сохраняет шаблон для повторного использования.
6bouter() возвращает функцию inner, но не вызывает её, поэтому ничего не печатается.
7cВложенные функции видят переменные enclosing-области.
8aЗамыкание требует возвращаемой вложенной функции, использующей переменные внешней.
9aПрисваивание внутри inner создаёт локальную переменную, внешняя не меняется.
10Пропущены скобки после def wrapper; правильно: def wrapper():.
111-d, 2-a, 3-c, 4-b.

Решение 1. Удаление HTML-тегов

import re


def remove_html_tags(text: str) -> str:
    return re.sub(r"<.*?>", "", text)


text = "<div>Hello, <strong>world</strong>!</div>"
print(remove_html_tags(text))  # Hello, world!

Логика: шаблон <.*?> находит текст от < до ближайшего > (ленивый квантификатор) и заменяет его пустой строкой. Для сложного HTML лучше использовать специализированный парсер, а не регулярные выражения.

Проверить по документации: для разбора реального HTML рекомендуется html.parser или сторонние библиотеки вроде BeautifulSoup.

Решение 2. Уникальные IP-адреса

def make_ip_tracker():
    seen: set[str] = set()

    def tracker(ip: str) -> int:
        seen.add(ip)
        return len(seen)

    return tracker


track = make_ip_tracker()
print(track("192.168.0.1"))  # 1
print(track("10.0.0.1"))     # 2
print(track("192.168.0.1"))  # 2
print(track("8.8.8.8"))      # 3

Логика: множество seen хранится в замыкании. Вложенная функция добавляет каждый новый адрес и возвращает текущее количество уникальных адресов.