Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🚘 Texnobloger Cybertruck’ini sotdi va...
📱 Texnobloger Twitter sahifasida Cybertruck avtomobilini sotganini e’lon qildi. Ortidan Ilon Mask uning akkauntidan obunani bekor qilganini payqab qolishdi.
🗣 Ijtimoiy tarmoq foydalanuvchilari bu qadamni “Maskga texnobloger qarori yoqmadi shekilli” deb baholashmoqda.
➡️#ilonmask | Birinchi raqamli IT-Blog
🚀 Ilon Mask X’da SpaceX aksiyalarini sotish orqali kompaniya qiymatini $800 mlrdga chiqarish haqidagi xabarlarni rad etdi
ℹ️ Uning aytishicha, SpaceX bir necha yildan beri ijobiy pul oqimini yaratib keladi va yiliga ikki marta aksiyalarni qayta sotib olib, xodimlar va investorlar uchun likvidlikni ta’minlaydi.
📰Bloomberg avvalroq aksiyalarni sotish rejalashtirilayotgani, bu esa ayrim investorlar uchun qisman chiqish imkonini berishi mumkinligi haqida xabar bergandi. Mask to'ga esa kompaniyaning moliyaviy barqarorligini ta’kidlab, vaziyatni aniqlashtirdi.
➡️#ilonmask#spacex | Birinchi IT-Blog
🤖 Ilon tog'a Maskov Tesla Optimus roboti kung-fu uslubida jang qilishni o‘rganayotganini namoyish qildi, uni hech kim boshqarmayapti...
➡️#robot#ilonmask | Birinchi raqamli IT-Blog
📝Grokipedia — Ilon Mask va uning xAI kompaniyasidan yangi onlayn ensiklopediya
ℹ️ Ilon Mask uzoq vaqtdan beri “Vikipediyani” “bir tomonlama” ekanligi uchun tanqid qilib keladi va shuning uchun sun’iy intellektga asoslangan o‘z alternativasini taqdim etdi.
✍️Grokipediyadagi maqolalar foydalanuvchilar tomonidan tahrir qilinmaydi, balki Grok sun’iy intellekt modeli tomonidan yaratiladi va qo‘llab‑quvvatlanadi. Shu bilan birga, Mask Vikipediyani tanqid qilgan bo‘lsa-da, ayrim materiallar aynan undan olingan yoki moslashtirilgan; bunday sahifalarda “Wikipedia’dan moslashtirilgan” degan belgi mavjud.
📊 Hozircha Grokipediya faqat ingliz tilida 885 000 maqolaga ega, Vikipediyada esa taxminan 7 million inglizcha maqola mavjud. Shuningdek, Mask ensiklopediyasida hozircha rasm yo‘q.
💡 Loyiha darhol ishonchlilik va mustaqillik bo‘yicha savollarni keltirib chiqardi: tanqidchilar tahrirlash tizimi shaffof emasligini va ayrim maqolalar bahsli nuqtai nazarlarni aks ettirayotganini ta’kidlashmoqda.
✅ Grokipedia barcha foydalanuvchilar uchun butunlay bepul ochiq, ammo hozircha faqat beta-versiya v0.1 sifatida mavjud.
➡️#ilonmask#grokipedia | Birinchi raqamli IT-Blog
💰 Errol o'g'li Ilon to'ga Maskov OpenAI'ni sotib olish uchun 97,4 milliard dollar taklif qildi
📱 Musk bu kompaniyani o‘zining xAI loyihasi bilan birlashtirishni rejalashtirmoqda.
❌ Sem Altman, OpenAI bosh direktori, taklifni rad etdi va hazil tariqasida:
“Yo‘q, rahmat. Lekin xohlasangiz, biz Twitter’ni 9,74 milliard dollarga sotib olishga tayyormiz,” dedi.
🤷♂️ Hozircha kelishuv bo‘yicha rasman hech qanday qaror qabul qilinmagan. Kelajakda muzokaralar davom etishi mumkin.
➡️#ilonmask#openai#ai#xai | Birinchi raqamli IT-Blog