Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
💚Tekkusai запустил в продажу новую обновленную версию своих IEM наушников — Lucid V2
Теперь в комплект входит:
✅Competitive адаптер для лучшего звучания
✅Новые пенные амбушюры
✅Более длинный и гибкий кабель
— Глубокие басы, плавные высокие частоты, широкая звуковая сцена. Высочайшая точность благодаря лучшему в своем классе драйверу, реагирует на то во что вы играете и предлагает полную настройку звучания.
💵Доступны к предзаказу со скидкой 14.990₽
САЙТ • МЕНЕДЖЕР • #TEKKUSAI
🪐Вводим сумасшедшую скидку на Tekkusai Singularity — теперь 5.990₽ вместо 7.490₽
— Акция продлится всего неделю: количество ограничено, поэтому рекомендуем поторопиться
😨
➡️Скидка уже активна на ReShip.pro* — оформляйте заказ прямо сейчас!
КАТАЛОГ • МЕНЕДЖЕР • #TEKKUSAI
🎙Рады сообщить что Tekkusai Singulsarity снова доступен к заказу!
🟣Сбалансированная поверхность
🟣Силиконовая подложка
🟣Закругленные края
🟣Закаленное стекло премиум-класса
🟣Размер 49 x 42 см
🟣Толщина всего 3 миллиметра
🟣И оригинальный дизайн от художника
💳Новая цена 7.490₽ - доступны по предзаказу
КАТАЛОГ • МЕНЕДЖЕР • #TEKKUSAI
💃Открыт предзаказ на TEKKUSAI PHANTOM — самый быстрый стеклянный ковер на рынке!
⚫️Самая быстрая поверхность
🟣Закаленное японское стекло
⚫️Размер 500 на 450 миллиметров
🟣Толщина всего 2.5 миллиметра
⚫️Резиновая подложка на всю поверхность
🟣Глайды Ghostglides Cyclone Pro в комплекте
💳Цена: 12.490₽ - эксклюзивно в ReShip
КАТАЛОГ • МЕНЕДЖЕР • #TEKKUSAI
🌎Первая партия Tekkusai Singularity уже у нас и скоро отправится к свои счастливым обладателям
🌎
🖱Среднее универсальное по скорости покрытие
🖱Размер 490х420 миллиметров
🖱Силиконовая подложка на всю поверхность
🖱Закругленные углы и края
🖱Цена 5.690₽
💻Оставайтесь с нами и следите за следующим поступлением этих ковров!
ОФОРМИТЬ ЗАКАЗ • КАТАЛОГ • #TEKKUSAI
🌎Tekkusai Lucid — стиль, качество, технологии
🌎Tekkusai, за плечами у которого бренды Kurosun и Glsswrks, представил свои первые внутриканальные наушники Lucid.
Это IEM с характеристиками, опережающими конкурентов, и безупречно стильным дизайном
🔎 Гибрид 4-драйвера: 8 мм динамик+BA+микро-планар+пьезо —плотный бас и чистые ВЧ
🔎Лёгкая раскачка: 26 Ω / 106 дБ — играют напрямую от смартфона, контроллера или ноутбука
🔎Широкая сцена и точное позиционирование — шаги и выстрелы в шутерах слышны «по координатам»
🔎Прочный металлический корпус, вес каждого наушника всего 5 грамм
🔎Комплект: 3 пары амбушюр + жёсткий кейс
💳Цена на предзаказ - 16.990₽
ОФОРМИТЬ ЗАКАЗ • КАТАЛОГ • #TEKKUSAI
📑Встречайте! Самый бюджетный и качественный Стеклянный коврик за все время - SINGULARITY by Tekkusai
🔎Сбалансированная поверхность
🔎Силиконовая подложка
🔎Закругленные края
🔎Закаленное стекло премиум-класса
🔎Размер 49 x 42 см
🔎Толщина всего 3 миллиметра
🔎И оригинальный дизайн от художника
💵И все это всего за 4.990₽ (такая цена только по предзаказу!) в ReShip, успевайте сделать заказ, так как количество сильно ограничено
ОФОРМИТЬ ЗАКАЗ • КАТАЛОГ • #TEKKUSAI