Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
ФУТБОЛКА «СКОРОСТЬ ДРИФТА» | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕ МАЯ 2026
⭐Размеры: XS-XL
⭐Материал: 85% хлопок, 15% полиэстер
⭐ Всего 2 цвета на выбор: коричневый, черный
⭐ Больше фото и таблицы: тык
💱Цены: 4700 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️ С реальными менеджерами
🅰️ Товар на сайте: тык
#ZZZ@astroknightshop
БЕЙСБОЛКА «СКОРОСТЬ ДРИФТА» | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕ МАЯ 2026
⭐Размеры: мужская 49-62 см; женская 47-60 см
⭐Материал: 100% полиэфирное волокно; подкладка козырька - 100% хлопок
⭐ Всего 5 видов на выбор: черная мужская с квадратными полями, черная женская с закругленными полями и круглым верхом, коричневая мужская с квадратными полями, коричневая женская с закругленными полями и круглым верхом, черная мужская с плоским козырьком и квадратным верхом
⭐ Больше фото и таблицы: тык
💱Цены: 3450 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️ С реальными менеджерами
🅰️ Товар на сайте: тык
#ZZZ@astroknightshop
ПЛЮШЕВАЯ ИГРУШКА-ПОДУШКА В ВИДЕ ОСЬМИНОГА АНГЕЛОВ НАВАЖДЕНИЯ | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕ СЕНТЯБРЯ 2026
⭐Материал: 100% полиэфирное волокно
⭐Размер: 40 см
💱Цены: 5550 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️ С реальными менеджерами
🅰️ Товар на сайте: тык
#ZZZ@astroknightshop
ПЛЮШЕВАЯ ИГРУШКА-ПОДУШКА В ВИДЕ БАНБУ АНГЕЛОВ НАВАЖДЕНИЯ | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕ СЕНТЯБРЯ 2026
⭐Материал: 100% полиэстер; наполнитель - 87% полиэстер, 13% полипропилен
⭐Размер: 40 см
💱Цены: 5550 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️ С реальными менеджерами
🅰️ Товар на сайте: тык
#ZZZ@astroknightshop
КРЕПЯЩИЙСЯ СВЕТИЛЬНИК-ВЫВЕСКА | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕИЮЛЯ2026
⭐Размер: 46х40х17 мм
⭐ Всего 3 стиля на выбор: магазин Yum Cha Sin, минимаркет 141, San-Z-студия
💱Цена: 1400 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️ С реальными менеджерами
🅰️ Товар на сайте: тык
#ZZZ@astroknightshop
МЕТАЛЛИЧЕСКИЕ ПИНЫ С ФРАКЦИЯМИ VOL.4 | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕИЮЛЯ2026
⭐Размер: Школа горы Юнькуй - 52х38 мм; Хижина Кошмаров - 52х53 мм; Надзорная служба Крампус - 53,5х49 мм
⭐ Vol. 1 - тут
⭐ Vol. 2 - тут
⭐ Vol. 3 - тут
⭐ Всего 3 стиля на выбор
💱Цена: 1100 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️ С реальными менеджерами
🅰️ Товар на сайте: тык
#ZZZ@astroknightshop
БЫСТРОЗАРЯЖАЕМЫЙ ПОРТАТИВНЫЙ АККУМУЛЯТОР С РАСШИРЯЕМОЙ ЕМКОСТЬЮ | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕ МАЯ 2026
⭐Размер: полный комплект 80,4х28х116 мм; зарядный модуль 80,4х28х66,5 мм; модуль расширения 80,4х28х43,6 мм
⭐ Материал: огнестойкий пластик
⭐Номинальная емкость: 8400 мАч (5В-3А)
⭐Максимальная мощность зарядки: 22,5 Вт
⭐ Технические характеристики: Вход USB-C: 5В-3А, 9В-2А, 12В-1,5А, макс. мощность 18 Вт; Выход USB-C: 5В-3А, 9В-2,22А, 10В-2,25А, 12В-1,67А, макс. мощность 22,5 Вт
⭐Всего 2 цвета (емкость 10000 мАч) на выбор: серый и черный
⭐Всего 2 цвета (емкость 5000 мАч) на выбор: серый и оранжевый
⭐Всего 4 цвета (емкость 10000 мАч + 5000 мАч) на выбор: черно-оранжевый, черно-серый, серо-оранжевый и двойной серый
⭐ В подарок к комплекту аккумуляторов идет сумка для хранения
⭐ Присутствует китайская сертификация ССС
⭐ Детали: тык
💱Цены:
➖ Емкость 5000 мАч 3550 🪙 (рублей)
➖ Емкость 10000 мАч 6200 🪙 (рублей)
➖ Емкость 10000 мАч + 5000 мАч 8700 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️С реальными менеджерами
#ZZZ@astroknightshop
УДЛИНЯЕМЫЙ КАБЕЛЬ ДЛЯ БЫСТРОЙ ЗАРЯДКИ И ПЕРЕДАЧИ ДАННЫХ | ОФИЦИАЛЬНЫЙ МЕРЧ | ZENLESS ZONE ZERO
⚡️Детали:
⭐ Релиз в КОНЦЕ МАЯ 2026
⭐Размер: короткий - 18 см; длинный - 1 м
⭐Питание: Type-C, макс. мощность 240 Вт
⭐ Технические характеристики: Type-C-Type-C; Рабочее напряжение от -5В до 48В; Макс. ток - 5В; Скорость передачи данных - -= 480 Мбит/с
⭐Всего 2 цвета на выбор: оранжевый и черный
⭐ Детали: тык
💱Цены:
➖ Кабель 18 см 1900 🪙 (рублей)
➖ Кабель 1 м 2800 🪙 (рублей)
➖ Кабель 18 см + 1 м 3850 🪙 (рублей)
👻Доставка:
🅰️Цена указана С УЧЕТОМ доставки ДО РФ
✉️Обратная связь:
⁉️Вопросы о доставке, оплате и тд.
👀Отзывы
💱Купить:
🅰️@astroknight_bot
🅰️С реальными менеджерами
#ZZZ@astroknightshop