Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#Milliyliboslarkuni
Milliylikning ijobiy ahamiyatini keng jamoatchilikka yetkazish hamda milliy qadriyatlarni targ‘ib qilish maqsadida Toshkent Kimyo xalqaro universiteti Namangan filialining talabalari tomonidan milliy liboslarda yaratilgan ko‘rinishlarni e’tiboringizga havola etamiz.
🌍BE SMART! BE SKILLED! BE PROFESSIONAL!
Bizni kuzating👇
🌐Website I ✅Telegram I 🌐Instagram I 📹Youtube I
🇺🇿 Milliy liboslar — millat faxri!
Bugun Toshkent davlat transport universiteti akademik litseyida“Milliy kiyimlar kuni” keng nishonlandi.
Tadbir davomida o‘quvchilar va o‘qituvchilar o‘zining milliy liboslarida ishtirok etib, xalqimizning boy madaniy merosi, urf-odatlari va qadriyatlarini o‘zida mujassam etgan liboslarni namoyish etishdi.
#MilliyLiboslarKuni
#Yoshlar#Akademik_litsey
📲Akademik litsey sahifalari:
Telegram | Instagram | Facebook
🏛 Toshkent davlat transport universiteti akademik litseyida “Milliy liboslar kuni” keng nishonlandi. Tadbirning maqsadi – o‘quvchi-yoshlar orasida milliy qadriyatlar, madaniyat va an’analarimizni targ‘ib qilish, milliy liboslar orqali Vatanimizga bo‘lgan mehr va faxr tuyg‘usini kuchaytirishdan iborat bo‘ldi.
Litsey o‘quvchilari turli hududlarning milliy kiyimlarida ishtirok etib, o‘ziga xos madaniy rang-baranglikni namoyon etdilar. Tadbir jarayonida milliy kuy-qo‘shiqlar, raqslar va ijodiy chiqishlar barchaga bayramona kayfiyat ulashdi. 🌺
#MilliyLiboslarKuni
#Yoshlar#Akademik_litsey
📲Akademik litsey sahifalari:
Telegram | Instagram | Facebook
🏛Toshkent davlat transport universiteti akademik litseyida Milliy liboslar kuni nishonlandi!
Tadbir davomida o‘quvchilarimiz milliy qadriyatlarimizni o‘zida mujassam etgan rang-barang liboslarda ishtirok etib, o‘zbek xalqining boy madaniy merosi, urf-odatlari va an’analarini namoyish etishdi.
💐 Tadbir samimiy va ko‘tarinki ruhda o‘tdi.
#MilliyLiboslarKuni
#Yoshlar#Akademik_litsey
📲Akademik litsey sahifalari:
Telegram | Instagram | Facebook
2️⃣2️⃣2️⃣
⚖️TDYUda har juma “Milliy qadriyatlar va Milliy liboslar” kuni !
💥💥💥💥💥💥💥💥💥💥
⚖️Jinoyat-protsessual huquqi kafedrasi professor-o‘qituvchilari milliy urf-odatlarimizni tarannum etuvchi ushbu tadbirida o‘zlarining betakror milliy kiyimlari bilan faol ishtirok etishmoqda.
🇺🇿Milliy qadriyatlarimiz – faxrimiz!
📸 Yuqorida tadbirdan eng yorqin lahzalar! ✨
#MilliyLiboslarKuni#TDYU#JinoyatProtsessualHuquqi#MilliyQadriyatlar
💃🏻✨TDYUda har juma “Milliy qadriyatlar va Milliy liboslar” kuni
🌹💫Jinoyat-protsessual huquqi kafedrasi professor-o‘qituvchilari milliy urf-odatlarimizni tarannum etuvchi ushbu tadbirida o‘zlarining betakror milliy kiyimlari bilan faol ishtirok etishmoqda hamda universitetimizning Navro’z tadbiriga tayyorgarlik ko’rishmoqda.
🇺🇿Milliy qadriyatlarimiz – faxrimiz!
📸 Yuqorida tadbirdan eng yorqin lahzalar! ✨
#MilliyLiboslarKuni#TDYU#JinoyatProtsessualHuquqi#MilliyQadriyatlar
🇺🇿🇺🇿🇺🇿TDYUda “Milliy liboslar” kuni nishonlandi!✨🧡
🍀🍀🍀28-fevral kuni Jinoyat-protsessual huquqi kafedrasi professor-o‘qituvchilari milliy urf-odatlarimizni tarannum etuvchi “Milliy liboslar” tadbirida faol ishtirok etishdi!
⭐️
⭐️
⭐️ Tadbir doirasida milliy liboslar namoyishi, fotosessiyalar, fleshmoblar tashkil etilib, kafedra a’zolari o‘zining betakror milliy kiyimlari bilan tadbirga yanada ko‘tarinki ruh bag‘ishlashdi.
🟥🟥🟥Milliy qadriyatlarimiz – faxrimiz!
#MilliyLiboslarKuni#TDYU#JinoyatProtsessualHuquqi#MilliyQadriyatlar
@TSUL_CPL
MILLIY LIBOS — MILLIY RUH AKSI.
Bugun Termiz temir yo‘l vokzalida ish jarayonlari o‘zgacha kayfiyatda tashkil etildi. Haftaning juma kuni doirasida o‘tkazilayotgan “Milliy liboslar kuni” tashabbusi vokzal xodimlari ishtirokida yuqori ruhda davom etdi.
Milliy liboslarda faoliyat yuritgan xodimlar xizmat jarayonlariga nafaqat tartib va mas’uliyat, balki milliy ruh va o‘ziga xos go‘zallik ham olib kirishdi. Atlas va adras matolaridan tikilgan liboslar vokzal muhitiga iliqlik va estetik uyg‘unlik bag‘ishladi.
Mazkur tashabbus orqali milliy qadriyatlarimizni asrab-avaylash, ularni kundalik hayotimizga singdirish hamda yosh avlod qalbida milliy o‘zlikni mustahkamlashga alohida e’tibor qaratilmoqda.
Termiz temir yo‘l vokzali jamoasi esa ushbu ezgu g‘oyani qo‘llab-quvvatlab, milliy an’analarimizni amalda namoyon etishda faol ishtirok etmoqda.
#MilliyLiboslarKuni#TermizVokzali#TemirYol#MilliyQadriyatlar#Juma#Uzbekistan
"Termiz MTU" filiali matbuot xizmati
Rasmiy sahifalarimiz:
🚉
📱Telegramm |📱Facebook |📱Web|