Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🌍 A delegation from the South African Embassy, led by Chargé d'Affaires a.i. Ms. Tandiwe Thelma Mgxwati, is arriving in Yekaterinburg for the annual international industrial trade fair INNOPROM. 🇿🇦
👋 We warmly welcome South African diplomats to the heart of the Urals. Welcome to Yekaterinburg!
#INNOPROM2025#Yekaterinburg#SouthAfrica#InternationalCooperation#RussiaSouthAfrica
🇷🇺🤝🇮🇳 Новости с INNOPROM 2025
Сегодня я выступил на стратегической сессии «Россия–Индия: к $100 миллиардам товарооборота» в рамках INNOPROM 2025 в Екатеринбурге.
Было честью разделить сцену с В. Кумаром, А. Соболевым, А. Агарвалом, Н. Рыбленковым, И. Куржиямским, М. Лабудиным, Б. Шрикантом и А. Крутовым.
Благодарю за возможность внести вклад в развитие торгового диалога между Индией и Россией как заместитель председателя Комиссии МТПП по Индии и президент группы компаний Soltex.
📍 Я на INNOPROM до вечера — буду рад встретиться!
#INNOPROM2025#ИндияРоссия#SoltexGroup#ManishKumar#Торговля#EAEUIndia
🇷🇺🤝🇮🇳 INNOPROM 2025 Update
Today, I had the honor of speaking at the strategic session “Russia–India: Toward a $100 Billion Trade Turnover” at INNOPROM 2025 in Ekaterinburg.
Proud to share the stage with H.E. Vinay Kumar, Andrey Sobolev, Anil Agarwal, Nikita Ryblenkov, Igor Kurzhiyamsky, Mikhail Labudin, Badiga Shrikant, and Alexander Krutov.
Grateful for the opportunity to contribute to India–Russia trade dialogue as Deputy Chairman of MCCI’s India Commission & President of Soltex Group.
📍 I’m at INNOPROM till evening — happy to connect!
#INNOPROM2025#IndiaRussia#SoltexGroup#ManishKumar#TradeGrowth#EAEUIndia
🇷🇺🤝🇮🇳 I’m pleased to share that I will be participating as a speaker at INNOPROM 2025, Russia’s largest international industrial trade fair, taking place from July 7–10 at the Ekaterinburg-EXPO.
On July 7 (10:30–12:00, Hall 3.4), I will speak in the strategic session:
“Russia–India: Toward a $100 Billion Trade Turnover.”
As President of Soltex Group and Deputy Chairman of the MCCI Commission on Foreign Economic Relations with Partners in India, I look forward to contributing to the dialogue on expanding bilateral trade, addressing non-tariff barriers, and advancing the EAEU–India Free Trade Agreement.
INNOPROM is a premier global platform where industry, innovation, and international cooperation converge — bringing together decision-makers from around the world.
🔗 Register: expo.innoprom.com/registration/visitor-2025
🎟 Promo Code: ZVCZ2A (Free Entry)
Let’s build the next chapter of India–Russia industrial partnership.
#INNOPROM2025#SoltexGroup#ManishKumar#IndiaRussia#EAEUIndia#TradeGrowth
🇷🇺🤝🇮🇳 Рад сообщить, что я буду выступать в качестве спикера на международной промышленной выставке INNOPROM 2025, которая пройдет с 7 по 10 июля в Международном выставочном центре «Екатеринбург-ЭКСПО».
Мое выступление состоится 7 июля с 10:30 до 12:00 в зале 3.4 в рамках сессии:
«Россия–Индия: К торговому обороту в $100 миллиардов»
В качестве Президента компании Soltex Group и Заместителя председателя Комиссии МТПП по внешнеэкономическим связям с партнерами в Индии я приму участие в обсуждении путей достижения целевого уровня товарооборота, снятия нетарифных барьеров и развития зоны свободной торговли между Индией и ЕАЭС.
INNOPROM — ведущая промышленная площадка России, объединяющая лидеров отрасли и решений.
🔗 Регистрация: expo.innoprom.com/registration/visitor-2025
🎟 Промокод для бесплатного входа: ZVCZ2A
Давайте вместе строить новое будущее российско-индийского промышленного сотрудничества!
#INNOPROM2025#SoltexGroup#ManishKumar#РоссияИндия#ПромышленнаяВыставка#ЕАЭСИндия