Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#Nókis rayonı
Xalıq penen ushırasıw
Qaraqalpaqstan Respublikası Transport ministrı orınbasarı B.Seytmuratov taraw qánigeleri menen birgelikte Nókis rayonı "Baxanshaqlı" MPJ aymaǵındaǵı Mádeniyat awılı puqaraları menen ushırastı.
Ushırasıwǵa aymaq turǵınları hám Nókis rayonı aymaǵında transport tarawında xızmet kórsetip atırǵan jolawshı tasıwshı kárxana basshıları qatnastı.
Ushırasıw dawamında puqaralar tárepinen berilgen múrájatlar taraw qánigeleri tárepinen dodalanip, tiyisliligi boyınsha sol jerdiń ózinde unamlı tárizde sheshim qabillandı.
Múrájat tiykarında Nókis rayonınan "Aqmańǵıt -Mádeniyat awılı" jónelisi boyınsha eksperement tárizde avtotransportlar jolǵa qoyılatuǵın boldı.
-----------
#Nukus tumani
Xalq bilan uchrashuv
Qoraqalpog‘iston Respublikasi Transport vaziri o‘rinbosari B.Seytmuratov soha mutaxassislari bilan birgalikda Nukus tumani "Baxanshaqli" MFY hududidagi Madaniyat qishlog‘i fuqarolari bilan uchrashdi.
Uchrashuvda hudud aholisi va Nukus tumani hududida transport sohasida xizmat ko‘rsatayotgan yo‘lovchi tashuvchi korxona rahbarlari ishtirok etdi.
Uchrashuv davomida fuqarolar tomonidan berilgan murojaatlar soha mutaxassislari tomonidan muhokama qilinib, tegishliligi bo‘yicha joyida ijobiy tarzda qaror qabul qilindi.
Murojaat asosida Nukus tumanidan "Oqmang‘it - Madaniyat qishlog‘i" yo‘nalishi bo‘yicha tajriba tariqasida avtotransportlar yo‘lga qo‘yiladigan bo‘ldi.
Instagram |🌐 sayt |✉️telegram |📱facebook|📱twitter
#Transport#Qadaǵalaw#Nókis
️ Nókis qalasındaǵı avtobuslarda tosıqsız ortalıq úyrenildi!
️Ózbekstan Mayıplar associaciyası Qaraqalpaqstan Respublikası aymaqlıq bólimi, Sociallıq inspekciyanıń Qaraqalpaqstan Respublikası basqarması hám Transport qadaǵalaw inspekciyası Avtomobil hám suw transportında qadaǵalaw Qaraqalpaqstan Respublikası aymaqlıq inspektorları qatnasıwında Nókis qalasında gezektegi reyd ilajları ótkerildi.
➤ Monitoring dawamında 24A-sanlı "Arqa - Batıs avtovokzal - Bereketli jel kóshesi" hám 7A-sanlı "Nókis qalalıq sawda kompleksi - Arqa - Batıs avtovokzal" avtobus jónelisleri qamtıp alındı:
Úyreniw dawamında ayırım aydawshılardıń mayıplıǵı bolǵan jolawshılarǵa itibarsızlıǵı, toqtaw belgilerine itibar bermewi hám mayıplıq arbasınan paydalanıwshı jolawshılarǵa panduslardı túsirip beriw boyınsha kónlikpeleri jetispeytuǵını baqlandı.
Jámietlik avtobuslarda málimleme monitorlarınıń sazlıǵı, aydawshılardıń bándirgi qaǵıydalarına ámel etiwi hám jolawshılarǵa kórsetilgen ámeliy járdem jaǵdayları unamlı bahalandı.Anıqlanǵan hár bir jaǵday boyınsha aydawshılar menen profilaktikalıq sáwbet ótkerildi.
——————————-
#Transport#Nazorat#Nukus
Nukus shahridagi avtobuslarda to‘siqsiz muhit o‘rganildi!
O‘zbekiston Nogironlar assotsiatsiyasi Qoraqalpog‘iston Respublikasi hududiy bo‘limi, Ijtimoiy inspeksiyaning Qoraqalpog‘iston Respublikasi boshqarmasi va Transport nazorati inspeksiyasi Avtomobil va suv transportida nazorat Qoraqalpog‘iston Respublikasi hududiy inspektorlari ishtirokida Nukus shahrida navbatdagi reyd tadbirlari o‘tkazildi.
➤ Monitoring davomida 24A-sonli "Shimol - G‘arb avtovokzal - Barakatli yel ko‘chasi" va 7A-sonli "Nukus shahar savdo majmuasi - Shimoliy - G‘arb avtovokzal" avtobus yo‘nalishlari qamrab olindi:
O‘rganish davomida ayrim haydovchilarning nogironligi bo‘lgan yo‘lovchilarga e’tiborsizligi, to‘xtash belgilariga e’tibor bermasligi va nogironlik aravachasidan foydalanuvchi yo‘lovchilarga panduslarni tushirib berish bo‘yicha ko‘nikmalari yetishmasligi kuzatildi.
Jamoat avtobuslarida axborot monitorlarining sozligi, haydovchilarning bekat qoidalariga rioya qilishi va yo‘lovchilarga ko‘rsatilgan amaliy yordam holatlari ijobiy baholandi.Aniqlangan har bir holat bo‘yicha haydovchilar bilan profilaktik suhbat o‘tkazildi.