Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🌐«РУССКИЕ СЕЗОНЫ» 2026 ПРОЙДУТ В… 3… 2… 1…
В 2026 году «Русские сезоны»пройдут в государстве Юго-Восточной Азии — в Королевстве Таиланд! 🎉
🇹🇭27 февраля состоится Торжественная церемония открытия Международного проекта «Русские сезоны» в Бангкоке.
🇹🇭1 марта «Русские сезоны» подарят тайской публике ряд своих ярких мероприятий на Пхукете.
В течение года будет представлена масштабная программа гастролей российских творческих коллективов, что позволит представить за рубежом лучшие образцы отечественной культуры! 🇷🇺
#РусскиеСезоны#RussianSeasons
🎄«Русские сезоны» сердечно поздравляют с наступающими праздниками — Новым годом и Рождеством!🎄
☃️ Пусть эти зимние дни превратятся для вас в тёплую историю со счастливым сюжетом, где в каждом мгновении живут уют, улыбки и маленькие чудеса, а время на мгновение замедлится, чтобы мы успели оглянуться на пройденный путь и улыбнуться результатам, созданным вместе.
❄️ В новом году мы от всей души желаем крепкого здоровья и внутренней силы, мира и достатка, гармонии в каждом дне, волшебства, которое тихо исполняет самые сокровенные желания, и любви — той самой, что согревает, вдохновляет и делает зиму по-настоящему тёплой!
🪄Пусть Жар-птица «Русских сезонов», продолжая свой полёт в 2026 году, подарит вам свет, везение и удачу — и каждый день вашей жизни превратится в поэзию открытий и феерию таланта и мастерства!😍💫
Спасибо, что остаетесь вместе с «Русскими сезонами»! ❤️
#РусскиеСезоны#RussianSeasons
А вы знали, что сегодня день рождения у человека, совершившего культурную революцию и возродившего русский балет? 🎉
🤩 Конечно, речь идет о талантливом Сергее Дягилеве — организаторе первых «Русских сезонов» за рубежом! Благодаря им Дягилев не только перевернул существовавший до этого балет, но и сделал русскую школу балета одной из лучших в мире!
🪄Благодаря импресарио русское искусство вышло на международную сцену и повлияло на развитие мировой культуры🤝И для нас сегодня очень важен тот факт, что мы продолжаем и совершенствуем начатое им дело.
🐦🔥 Нынешние «Русские сезоны», являющиеся своеобразным преемником «дягилевских», расширили сферу деятельности проекта и добавили в него много нового: концерты, выставки, мастер-классы, мультипликации, лекции и многое другое. Но цель проекта остается прежней — показать миру всю красоту и многообразие русской культуры!
#РусскиеСезоны#RussianSeasons
Конец зимы — время продолжения яркой программы «Русских сезонов»
в Бахрейне 🇧🇭 и Омане 🇴🇲
В февральской программе:
🏔️ Легендарный Государственный Академический заслуженный ансамбль танца Дагестана «Лезгинка»с программой «Мир сквозь танец», в которую вошли знаковые для коллектива хореографические композиции.
🎧Киностудия «Союзмультфильм» с увлекательной образовательной программой «Давай вместе!»:
🟠показ лучших российских мультфильмов для детей;
🟠 лекции о современных техниках анимации для представителей профсообщества аниматоров;
🟠 мастер-классы от художников-мультипликаторов «Богатыри земли русской» и «Щелкунчик»;
🟠 мастер-классы по изготовлению брелоков, значков и футболок.
🎨Тульские мастера с мастер-классами по росписи филимоновской глиняной игрушки и тульского пряника.
🥞Мастер-классы по приготовлениюблюдтрадиционной русской кухни.
#РусскиеСезоны#RussianSeasons
😍Чем удивят «Русские сезоны» в 2025 году? 🤌
🪄Насыщенная программа включает гастроли известнейших российских коллективов, составляющих культурную славу России, мастер-классы, лекции, показы анимационных фильмов, а также масштабные выставочные проекты.
Лучшие образцы отечественной культуры представят:
🔶 Академия Русского балета имени А.Я. Вагановой,
🔶 Государственный Академический заслуженный ансамбль танца Дагестана «Лезгинка»,
🔶 Национальный академический оркестр народных инструментов России имени Н.П. Осипова,
🔶 Киностудия «Союзмультфильм».
Уникальные экспозиции представят ведущие музеи России:
🟧 Третьяковская галерея,
🟧 Государственный Эрмитаж,
🟧 Историко-культурный музей-заповедник «Московский Кремль».
Мероприятия «Русских сезонов» в Королевстве Бахрейн 🇧🇭 и Султанате Оман 🇴🇲будут проходить в течение всего года.
#РусскиеСезоны#RussianSeasons
🌐«РУССКИЕ СЕЗОНЫ» 2025 ПРОЙДУТ В… 3… 2… 1…
В 2025 году «Русские сезоны»пройдут в странах Персидского залива — в Королевстве Бахрейн и Султанате Оман! 🎉
🇧🇭27 января состоится Торжественная церемония открытия Международного проекта «Русские сезоны» в Королевстве Бахрейн.
🇴🇲1 февраля состоится Церемония открытия Международного проекта «Русские сезоны» в
Султанате Оман.
В течение года будет представлена масштабная программа гастролей российских творческих коллективов, что позволит представить за рубежом лучшие образцы отечественной культуры! 🇷🇺
#РусскиеСезоны#RussianSeasons
🎄«Русские сезоны» сердечно поздравляют с наступающими праздниками — Новым годом и Рождеством!🎄
☃️ Пусть это время станет для вас настоящей сказкой, где каждый миг будет наполнен радостью, теплом и чудесами, а под бой курантов ваши мечты взлетят высоко, как яркие фейерверки, освещая путь к новым свершениям!
❄️ В новом году мы желаем вам крепкого здоровья и сил, благополучия и гармонии, волшебства, исполняющего все заветные желания и бесконечной любви, согревающей сердце даже в самые холодные дни.
🪄Пусть Жар-птица «Русских сезонов», продолжая свой полёт в новом году, подарит вам свет, везение и удачу — и каждый день вашей жизни превратится в поэзию открытий и феерию таланта и мастерства!😍💫
#РусскиеСезоны#RussianSeasons
June: CULTURAL HOLIDAYS
🟠 06.06 — Pushkin's Day of Russia
🟠 08.06 — All-Russian Poetry Festival
🟠 23.06 — Balalaika Day - international holiday of folk musicians
🟠 25.06 — Day of Friendship and Unity of the Slavs
#RussianSeasons#РусскиеСезоны
May: CULTURAL HOLIDAYS
🟠 18.05 — International Museum Day
🟠 21.05 — World Day for Cultural Diversity for Dialogue and Development
🟠 23.05 — 500th anniversary of the Novodevichy Convent
🟠 24.05 — Day of Slavonic Script and Culture
🟠 25.05 — Day of the Philologist in Russia
#RussianSeasons#РусскиеСезоны
April: CULTURAL HOLIDAYS
🟠08.04 — Russian Animation Day
🟠15.04 — International Day of Culture
🟠29.04 — International Dance Day
🟠30.04 — International Jazz Day
#RussianSeasons#РусскиеСезоны
🌐«Русские Сезоны» вернулись в родное сообщество во ВКонтакте!
Все, кто интересуется деятельностью «Русских Сезонов», наверняка знают, что наш проект успешно существует и развивается с 2017 года. За это время мы представили лучшие образцы российской культуры в десятках стран, среди которых — Франция, Бельгия, Германия, Люксембург, Япония, Казахстан и Узбекистан. Все это было подробно освещено в наших социальных сетях 📲
В 2023 году Международный культурный проект «Русские Сезоны» начал новый виток своего развития, в связи с чем были с нуля запущены все социальные сети.
❗️НО сегодня мы спешим к вам с радостными новостями — мы возвращаемся в первоначальное сообщество VK, где проводилась вся работа с момента существования проекта!
💙 — https://vk.com/russianseasons_project
Добро пожаловать на новую страничку! Спасибо за вашу поддержку, не теряйте нас и следите за обновлениями!
👍
#РусскиеСезоны#RussianSeasons