Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для URL, имени файла, имени объекта в каком-то софте и тд. Требования совместимости простые: в тексте должны быть только допустимые символы. Обычно это a-z, 0-9 и "_" или "-". То есть, только прописные буквы латинского алфавита и цифры (как пример).
Допустим, нам нужно название статьи в блоге преобразовать в slug для добавления его в URL этой статьи. Как это лучше всего сделать?
В Django по умолчанию есть готовая функция slugify для таких случаев.
Но я её никогда не использую. Почему? Потому что её недостаточно!
Приведём пример
>>> from django.utils.text import slugify
>>> slugify('This is a Title')
'this-is-a-title'
Пока всё отлично
>>> slugify('This is a "Title!"')
'this-is-a-title'
Спец символы удалились, всё хорошо.
>>> slugify('Это заголовок статьи')
''
Вот и приехали 😢. Если текст не английский то буквы просто игнорируются. Можно это поправить
>>> slugify('Это заголовок статьи', allow_unicode=True)
'это-заголовок-статьи'
Но тогда мы не вписываемся в условие. У нас появилась кириллица в тексте.
Так как я часто пишу сайты для русскоязычных пользователей эта проблема весьма актуальна. Я не использую стандартную функцию и всегда пишу свою.
Оригинал я не беру в расчёт и пишу полностью свою функцию. И так, по порядку:
🔸1. Исходный текст:
>>> text = 'Мой заголовок №10 😁!'
Взял специально посложней со специальными символами.
🔸2. Транслит
Необходимо сделать транслит всех символов в латиницу. Здесь очень выручает библиотека unidecode. Помимо простого транслита кириллицы в латиницу она умеет преобразовывать спец символы и иероглифы в текстовые аналоги.
from unidecode import unidecode
>>> unidecode("Ñ Σ ® µ ¶ ¼ 月 山")
'N S (r) u P 1/4 Yue Shan'
Очень крутая библиотека, советую👍
В нашем случае получаем такое преобразование:
>>> text = unidecode(text)
>>> print(text)
'Moi zagolovok No. 10 !'
Отличный транслит. Смайл просто удалился, хотя я ждал что-то вроде :). Ну и ладно, всë равно невалидные символы.
А еще наш код уже поддерживает любой язык, будь то хинди или корейский.
🔸4. Фильтр символов
Unidecode не занимается фильтрацией по недопустимым символам. Это мы делаем в следующем шаге через regex. Просто заменим все символы на "_" если они вне указанного диапазона.
>>> text = re.sub(r'[^a-zA-Z0-9]+', '_', text)
>>> print(text)
'Moi_zagolovok_No_10_'
Символ "+" в паттерне выручает когда несколько недопустимых символов идут рядом. Все они заменяются на один символ "_".
🔸5. Slugify
Осталось удалить лишние символы по краям и сделать нижний регистр
>>> text = text.strip('_').lower()
>>> print(text)
'moi_zagolovok_no_10'
Получаем отличный slug! 😎
🌎 Полный код в виде функции.
______________
PS. Проверку что в строке остался хоть один допустимый символ я бы вынес в отдельную функцию.
#libs#tricks#django
🎃✨ ХЕЛЛОУИНСКИЙ РОЗЫГРЫШ #magicalpower! ✨🦇
Готова почувствовать себя настоящей ведьмочкой из Trix? 💜 В честь Хеллоуина мы приготовили 3 магических подарка 🧚♀️
Хочешь увеличить шансы? Приглашай друзей по реферальной ссылке, которую пришлёт бот! Каждый подписавшийся +1 шанс на победу! 🔮
💫 Разыгрываем три бокса из наборов: подарочный набор Sisters Power Gift Set и набор кистей Witch Essentials #magicalpower
👻 Как принять участие
1. Подписаться на канал @sodamakeup и не отписываться до окончания розыгрыша 🍂
2. Нажать кнопку "Участвовать" в конце поста 😶🌫️
Розыгрыш проводится на территории РФ.
🎃 Удачи всем феям и ведьмочкам ! 🌙
Участников: 1228
Призовых мест: 3
Дата розыгрыша: 18:00, 31.10.2025 MSK (завершён)
Победители розыгрыша:
1. Lillac - 46vopu
2. юля - 461i9i
3. ❤️ - 45tih7
Пришло время выбрать, на чьей ты стороне...
🌈 Нежность, яркость, очарование фей Винкс?
Познай магию дружбы и гори ярче звезд с Блум, Стеллой, Флорой, Музой, Текной и Лейлой!
⚡А может дерзость, загадка и темная эстетика Трикс?
Гипнотизируй, провоцируй и управляй вместе с Дарси, Сторми и Айси!
Какую бы бьюти-магию ты ни выбрала, главное, что ты с SODA — ведь только вместе мы сильны 💖
SODA x WINX: CHOOSE YOUR SIDE!
#magicalpower
🤩Нана Осаки одобряет! Твой рок-макияж с Soda 🤩
Эстетика Nana — это про страсть, музыку и бескомпромиссный стиль. Повтори фирменные черты Осаки Наны с нашими маст-хэвами:
🤩 Взгляд с характером: Кремовая подводка Miraculous, 301 или маркер S-CLASS, 201 regressor — плотный черный для глубокого, пронзительного взгляда.
🤩 Глубина цвета: Палетка Beware Of Witches #magicalpower даст нужные оттенки для создания фирменного smoky eye.
🤩 Губы: Нанеси вельветовую помаду Hypnotizing #magicalpower, 101 Riven для матового, драматичного эффекта.
🤩Детали: Добавь немного панка с металлическими заколками Fire Hearts!
Ready to rock? 🎸
#sodainspiration
А мы тут узнали, что ученые открыли новый цвет, Olo... И очень вдохновились! Он похож на Tiffany Blue и бирюзовый Pantone 15-5519, но по сравнению с Olo они менее насыщенные ❤️
Вне лаборатории его пока не увидеть, но мы на 99% уверены, что уже видели что-то похожее в коллекции SODA x WINX 🤔
#sodainspiration#magicalpower
А ведь мы еще не разыгрывали аксессуары из новой коллекции 👀 Пора это исправить!
Разыгрываем три бокса, в каждом будет три аксессуара, тинт и жидкие тени 💕
Как поучаствовать?
1. Подписаться на канал @sodamakeup и не отписываться от него до окончания розыгрыша ☀️
2. Нажать кнопку "Участвовать" в конце поста
😍
⚡ Кстати, если вы хотите повысить свои шансы на победу, то приглашайте друзей подписаться по реферальной ссылке, которую пришлет бот. Каждый подписавшийся по вашей ссылке это +1 шанс!
*Розыгрыш проводится на территории РФ.
💏 Результаты 26 апреля в 18:00 по мск, будет 3 победителя!
Всем удачи 💋
#sodateam#magicalpower
Участников: 2384
Призовых мест: 3
Дата розыгрыша: 18:00, 26.04.2025 MSK (завершён)
Победители розыгрыша:
1. Настя . - 2vutr5
2. Наталия Седельникова - 312m6e
3. пустота - 2vt2bk
Новая коллекция требует розыгрыша, согласны?
❤️
Разыгрываем три бокса, в каждом будет три(!) новых палетки, жидкий хайлайтер с Блум Dragon Flame, помада с Блум Fire Vortex и палетка для лица с Флорой Swirl Of Petals 😘
Как поучаствовать?
1. Подписаться на канал @sodamakeup и не отписываться от него до окончания розыгрыша 🌸
2. Нажать кнопку "Участвую" в конце поста 🐾
3. Проявлять активность 😇
⚡️ Кстати, если вы хотите повысить свои шансы на победу, то приглашайте друзей подписаться по реферальной ссылке, которую пришлет бот. Каждый подписавшийся по вашей ссылке это +1 шанс!
*Розыгрыш проводится на территории РФ.
🫦 Результаты 1 апреля в 18:00 по мск, будет 3 победителя!
Всем удачи 💋
#sodateam#magicalpower
Участников: 4243
Призовых мест: 3
Дата розыгрыша: 18:00, 01.04.2025 MSK (завершён)
Победители розыгрыша:
1. Мария - 2p9n8m
2. 𝒪𝓂𝑔 𝒳𝒟 #ℳℛ𝒦𝒮 #𝒮𝒲ℰℰℰ𝒢 #+ℛ𝒶𝓅 - 2p991c
3. Ефим Кондаков - 2pbe66
Ну вот, теперь все секреты раскрыты! Угадали цвета палетки? Уже думаете над образами, которые с ней можно создать? ☺️
Между нами, новая коллекция уже стоит в моно бутике Soda в Авиапарке и разъезжается по летуалям, так что ожидайте в своём городе 😉
#sodateam#magicalpower
Наконец-то и на улице весна, поэтому спешим доставать обе палетки с феечками для поиска всех-всех розовых оттенков: Heart of Alfea и Magical Dust 🌸
#magicalpower#sodatips
Зима вернулась на улицы только для того, чтобы мы показали макияж в стиле Айси новой палеткой Beware Of Witches❄️
Повторяем, пока снег лежит?
#magicalpower#sodatips