Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Oliy taʼlim muassasalari talabalari o‘rtasida "Quvnoqlar va zukkolar” ko‘rik-tanlovining "Talabalar ligasi"ga start berildi.
Talaba-yoshlarning tashabbuslarini qo‘llab-quvvatlash hamda quvnoq va zukko yigit-qizlarning iqtidor va isteʼdodini namoyon etishiga ko‘maklashish maqsadida ilk marotaba "Talabalar ligasi" loyihasi yo‘lga qo‘yildi.
Oliygohlarning talabalari o‘rtasidagi fakultetlararo final bosqichlari 20-sentabrdan 20-dekabrgacha soat 15.00 dan boshlab Yoshlar ijod saroyida har kuni tashkil etiladi.
Barcha QVZ ixlosmandlarini Yoshlar ijod saroyida bo'lib o'tadigan ko'rik-tanlovlarga taklif etamiz!
P.S. Kirish bepul🙋🏻♀️
#QuvnoqlarVaZukkolar#talabalarligasi#beshtashabbus
🕊@dkattakhanova📱Facebook
📱Instagram🌐LinkedIn🕊Twitter
Highlights from the Youth Day at Green University.
#GreenUniversity#YouthDay#StudentLeague#TeamSpirit#Leadership
__________________________
Green University Yoshkar kunidan lavhalar.
#GreenUniversity#YoshlarKuni#TalabalarLigasi#TalabalarHayoti#Jamoaviylik#Liderlik
✉️[email protected]
☎️ +998 55 512 00 77
📍Location
🌐Website | 📱Telegram | 📱Instagram | 📱LinkedIn | 🟥YouTube
📌On April 9, Green University actively celebrated Youth Day with a dynamic and engaging program that brought together students, faculty, and administration.
🗣️Throughout the day, participants took part in a wide range of activities — from educational workshops and intellectual games to open lectures and cultural events. The atmosphere was vibrant, reflecting the energy, enthusiasm, and ambition of the youth.
A special highlight was the opening of the Student League sports competitions, where the university rector, Dr. Bakhtiyor Pulatov personally took part alongside students. His participation made the event even more inspiring, strengthening the spirit of unity, teamwork, and friendly competition.
✅Youth Day at Green University once again proved that the university is not only a center of education, but also a space where students actively develop, engage, and succeed together.
#GreenUniversity#YouthDay#StudentLeague#StudentLife#TeamSpirit#Leadership
👉ReadMore __________________________
📌9-aprel kuni Green University'da Yoshlar kuni keng qamrovli va mazmunli dastur asosida faol tarzda nishonlandi. Tadbirlar davomida talabalar, professor-o‘qituvchilar hamda universitet rahbariyati birlashdi.
🗣️Kun davomida ishtirokchilar turli ta’limiy seminarlar, intellektual o‘yinlar, ochiq ma’ruzalar va madaniy tadbirlarda faol qatnashdilar. Muhit yoshlarga xos energiya, ishtiyoq va intilishlarga boy bo‘ldi.
Tadbirning eng esda qolarli biri Talabalar ligasi sport musobaqalarining ochilish marosimi bo‘ldi. Unda universitet rektori, professor Baxtiyor Pulatov ham talabalar bilan bir qatorda ishtirok etib, o‘zining faol ishtiroki orqali birlik, jamoaviylik va sog‘lom raqobat muhitini yanada mustahkamladi.
✔️Green University'da Yoshlar kuni yana bir bor universitet nafaqat ta’lim maskani, balki talabalar har tomonlama rivojlanadigan, faol ishtirok etadigan va birgalikda yuksaladigan muhit ekanini namoyon etdi.
#GreenUniversity#YoshlarKuni#TalabalarLigasi#TalabalarHayoti#Jamoaviylik#Liderlik
👉Batafsil
✉️[email protected]
☎️ +998 55 512 00 77
📍Location
🌐Website | 📱Telegram | 📱Instagram | 📱LinkedIn | 🟥YouTube