Удалить смайлики по шаблону из строки

11. Удалить смайлики по шаблону из строки

Условие задачи:
Дан набор строк. Требуется за линейное время для каждой строки удалить все подстроки, соответствующие заданному регулярному выражению смайликов :-)+|:-(+, и вывести очищенный текст.

Пример:
Даны сообщения из соцсети, например:

"Я работал в Гугле :-))))"
"везет :-) ☹ я туда собеседование завалил:-(("
"лол:)"
"Аааа!!!!! :-))(()"

Нужно удалить из них все смайлики, которые подходят под регулярное выражение:

:-\)+|:-\(+ 

После удаления должно получиться так:

"Я работал в Гугле "
"везет  ☹ я туда собеседование завалил"
"лол"
"Аааа!!!!! (()"
Спойлеры к решению
Подсказки
  • Для удаления подстрок по регулярному выражению удобно использовать re.sub().
  • Регулярное выражение :-\)+|:-\(+ удаляет смайлики вида :-), :-)), :-(, :-((.
  • В примере строка "лол:)" превращается в "лол", но :) не подходит под регулярку :-\)+|:-\(+, потому что там нет дефиса.
  • Чтобы результат совпал со всеми примерами, нужно разрешить необязательный дефис после :.
  • Для этого можно использовать регулярное выражение :-?\)+|:-?\(+.
Решение
import re


def remove_smiles(messages: list[str]) -> list[str]:
    pattern = r":-?\)+|:-?\(+"

    result = []

    for message in messages:
        cleaned_message = re.sub(pattern, "", message)
        result.append(cleaned_message)

    return result

Пример использования:

messages = [
    "Я работал в Гугле :-))))",
    "везет :-) ☹ я туда собеседование завалил:-((",
    "лол:)",
    "Аааа!!!!! :-))(()",
]

cleaned_messages = remove_smiles(messages)

for message in cleaned_messages:
    print(message)

Результат:

Я работал в Гугле 
везет  ☹ я туда собеседование завалил
лол
Аааа!!!!! (()

Функция проходит по списку строк и для каждой строки удаляет все подстроки, похожие на смайлики. Регулярное выражение :-?\)+|:-?\(+ означает:

:-?\)+  — смайлик с закрывающими скобками: :), :-), :-)), :-)))
:-?\(+  — смайлик с открывающими скобками: :(, :-(, :-((, :-(((

Дефис сделан необязательным через -?, потому что в примере есть строка "лол:)". Если использовать строго регулярное выражение из условия :-\)+|:-\(+, то строка "лол:)" останется без изменений.