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)
Результат:
Я работал в Гугле
везет ☹ я туда собеседование завалил
лол
Аааа!!!!! (()
Функция проходит по списку строк и для каждой строки удаляет все подстроки, похожие на смайлики. Регулярное выражение :-?\)+|:-?\(+ означает:
:-?\)+ — смайлик с закрывающими скобками: :), :-), :-)), :-)))
:-?\(+ — смайлик с открывающими скобками: :(, :-(, :-((, :-(((
Дефис сделан необязательным через -?, потому что в примере есть строка "лол:)". Если использовать строго регулярное выражение из условия :-\)+|:-\(+, то строка "лол:)" останется без изменений.