Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Heyyy amici! 🌟 Un breve pit stop dalle corse social per prendere fiato e prepararmi per un Super 2024.🚀 Ma tranquilli, non vi lascio senza il vostro #wallpaper quotidiano! 😎 Fatemi sapere se vi e piaciuto con la solita reaction. #NewBeginnings"
Команда VEON AdTech поздравляет всех с весенним праздником Навруз!🎉
Навруз — это не просто праздник весны, но и символ обновления, вдохновения и новых возможностей. Мы знаем, что каждый новый день — это шанс создать что-то уникальное, будь то инновационная рекламная кампания или технологическое решение, которое меняет правила игры.
В VEON AdTech мы каждый день создаем цифровые решения, которые меняют реальность, объединяя людей и технологии. Пусть эта весна принесет вам смелые решения, прорывные идеи и амбициозные проекты!
Время новых начинаний — сейчас. С праздником!🌸
#VEONAdTech#IT#NewBeginnings#Navruz2025
🇺🇿 Post 46 — Yangi Boshlanishlar 🌍✈️
Bir oy ham juda tez o‘tib ketdi. Endi yana ishga qaytyapman. Vatanimni tark etish og‘riqli, albatta, lekin kelajak uchun yaxshi imkoniyatlarga intilish — bu ham hayotning bir qismi. Har qanday qiyinchilik orqasida yangi imkoniyatlar yashirin.
Yana BAAga qaytaman! Bu safar yanada ko‘proq tajriba, o‘sish va yutuqlar bilan qaytaman 🤲
Kelajak uchun kurash davom etadi! 🙌✨
🇬🇧 Post 46 — One Month and New Beginnings 🌍✈️
One month flew by so fast. Now, I’m heading back to work. Leaving my homeland is painful, for sure, but striving for better opportunities is a part of life. Behind every hardship lies a new chance.
I’m returning to the UAE and the Ladurée family! This time with even more experience, growth, and achievements. Moving forward with patience and confidence.
The fight for a better future continues! 🙌✨
24/08/2025
#NewBeginnings#NextChapter#LaduréeJourney
#EverythingILived
📚🎉Welcome, Class of 2024! 🎉📚
✅Day 1 of Orientation Week at Green University was a huge success! Here's what our amazing new students experienced:
⏺Warm welcome from our Rector, Dr. Jasur Salikhov
⏺Exciting presentations from our Research Institutes
⏺Introduction to our Retraining Center
⏺Eye-opening session on our work in the Aral Sea basin
⏺Comprehensive campus tour, including state-of-the-art facilities and scientific labs
⚡️We're thrilled to have you all on campus and can't wait for Day 2 – it's going to be even more engaging! 💚🌱
#GreenUniversity#OrientationWeek#ClassOf2024#NewBeginnings#HigherEducation#CampusLife#AralSea#Sustainability
🚀 UXLINK、東京オフィスオープン!🇯🇵
つながりが新たな価値を生む時代。
UXLINKは、より強固なコミュニティの構築とグローバルな成長を加速させるため、東京オフィスを正式にオープンしました! 🎉
しかも… 東京タワーを一望できる最高のロケーション!🗼✨
ここからWeb3の未来を創る皆さんとともに、新たなつながりを広げていきます。
これからの日本の展開をお楽しみに!
#UXLINK#東京オフィス#TokyoTower#Web3#つながりの力#新たなステージ
🚀 UXLINK Tokyo Office is Now Open! 🇯🇵
💪A new chapter begins.
To strengthen our global network and accelerate Web3 innovation, UXLINK has just officially opened its Tokyo office! 🎉
And the best part....? A breathtaking view of Tokyo Tower right from our workspace. The office is just at the central heart of Tokyo🗼✨
From Tokyo to the world, we’re building the future of connections.
Stay tuned for what’s next. 🔥
#UXLINK#TokyoOffice#Web3#TokyoTower#NewBeginnings#FutureOfConnections