Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#ITC#Robototexnika
⚡️Markazimizda Robototexnika kurslari boshlanmoqda
Kursning afzalliklari:
➖O'quv jarayonida zarur bo'lgan materiallar markaz tomonidan beriladi;
➖ Kompyuter va internet bilan jihozlangan shinam xonalar;
➖ Darslar professional mutahassis tomonidan olib boriladi;
➖ Respublika, viloyat hamda jahon miqyosidagi musobaqa va tanlovlarga borish imkoniyati;
➖ Hamyonbop narxlar
🚀 Dastlabki guruh uchun faqatgina 10 nafar o'quvchi qabul qilamiz.
Batafsil ma'lumot uchun:
Tel: 990009627 | 950033748
Ijtimoiy tarmoqda murojaat:
Menejer | Telegram kanal | Mutahassis
#ITC#Robototexnika
Nocomment | Ta'rif shart emas
🔥Markazimizda o'z ish faoliyatini boshlagan Robototexnika bo'yicha professional mutahassis Azizxon Akramov tomonidan yasalgan telefon orqali boshqariladigan mashina
@ITCenter_Yaypan — zamonaviy kasblar markazi
IT Yakkabog’
Birinchi dars – birinchi natija! 💥
O‘quvchilarimiz qo‘llarida wedo 2.0 , oldida g‘oya — natijada esa harakatlanadigan robot 🤖
Har bir katta ixtiro — kichik bir darsdan boshlanadi.
#robototexnika#boshlanish#o‘quvchilarijodi #texnologiya#education
IT Yakkabog’
Birinchi dars – birinchi natija! 💥
O‘quvchilarimiz qo‘llarida wedo 2.0 , oldida g‘oya — natijada esa harakatlanadigan robot 🤖
Har bir katta ixtiro — kichik bir darsdan boshlanadi.
#robototexnika#boshlanish#o‘quvchilarijodi #texnologiya#education
📍 Yakkabog‘ tumanida ilk bor ochilayotgan IT markazi o‘z qabullarini boshladi!
📞 Batafsil ma’lumot: +998(99)-126-32-07
#Yakkabog#IT#SMM#Dizayn#Robototexnika#Kelajak#yakkabog’
🚀Kelajak kasblarini o‘rganish endi Yakkabog‘liklar uchun yanada qulay!
📍 Yakkabog‘ tumanida ilk bor ochilayotgan IT markazi o‘z qabullarini boshladi!
✨Bu yerda siz: 💻 IT | 📱 SMM | 🎨 Grafiz dizayn | 🤖 Robototexnika kabi kasblarni nafaqat o’rganib, balki haqiqiy proektlar ustida ishlab ko’rasiz!
Joylar soni cheklangan!
Hozirning o‘zida bog‘laning va kelajak sari ilk qadamni tashlang! ✨
📞 Batafsil ma’lumot: +998(99)-126-32-07
#Yakkabog#IT#SMM#Dizayn#Robototexnika#Kelajak
🚀 IT Yakkabog’da barcha kurslarga qabul boshlandi!
💡 Orzuyingizdagi IT kasblariga ilk qadamni qo’ying!
⏳ Joylar soni cheklangan, imkoniyatni boy bermang!
📞 Batafsil ma’lumot uchun:
+998 (99) 126-32-07
#kelajak#robototexnika#dizayn#smm#it#yakkabog#fyp
🤖🌐 Diqqat, kelajak muhandislari va ijodkorlari! 🌟
🔧 Ziyo Day doirasida #Robototexnika bo'yicha MasterClass! 🔧
📅 16 dekabr, 13:15-15:00
5-8-sinf o‘quvchilari uchun robot yig‘ish bo‘yicha amaliy tajribaga ega bo‘ladigan qiziqarli robototexnika mahorat darsi! 🚀
Tadbir dasturi:
13:15-13:35: Robototexnika kursi taqdimoti bilan kelajak eshigini oching.
13:35-13:50: Robotning elementlari va ularning roli haqida hamma narsani bilib oling.
13:50-15:00: O'z robotingizni yaratish imkoniyati!
Ziyo Day robototexnika olamida yorqin xotira va unutilmas sarguzasht bo'ladi. Hammani taklif qilamiz! 💡🛠
Tadbirha qatnashish uchun @YouthCenterZiyo telegram kanalimizda oldindan ro'yxatdan o'tishni unutmang.
🤖🌐 Внимание, будущие инженеры и творцы! 🌟
🔧#МастерКлассПоРобототехнике в рамках ziyo day! 🔧
📅 16 декабря, 13:15-15:00
✨ Готовьтесь к захватывающему опыту робототехники, специально для школьников 5-8 классов!
🚀 Программа события:
13:15-13:35: Открой дверь в будущее с презентацией курса робототехники.
13:35-13:50: Разберем каждую деталь - узнай всё о элементах робота и их роли.
13:50-15:00: Ваш шанс создать своего робота! - Практический этап, где вы воплотите свои идеи в жизнь.
Ziyo day станет ярким воспоминанием и незабываемым приключением в мире робототехники. Приглашаем всех желающих! 💡🛠
Не забудьте зарегистрироваться заранее в нашем телеграм-канале @YouthCenterZiyo, чтобы гарантировать себе место на мероприятии. #Робототехника#Образование
#Robottexnika#Ta'lim #ZiyoDay#TerritoryOfYourDevelopment#EducationRevolution#ZiyoCommunity#ТерриторияТвоегоРазвития#ZiyoJamiyati#SizningRivojlanishHududi.