Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#BIRTHDAY
Jamoamizning fidoyi yordamchi murabbiyi Aziz Mamatov hamda yosh darvozabonimiz Shoxrux Axtamovni tavallud ayyomlari bilan chin qalbimizdan tabriklaymiz!
Sizlarga mustahkam sog‘lik, cheksiz kuch-g‘ayrat va sport faoliyatingizda ulkan zafarlar tilaymiz. Jamoamiz ravnaqi yo‘lida qilayotgan mehnatlaringiz doimo o‘z samarasini bersin!
Maydonda ham, hayotda ham doimo g‘alabalar siz bilan bo‘lsin!
Hurmat bilan BMB PFC oilasi.
Telegram|Facebook|Instagram | Uzum
https://x.com/priceactiongann/status/1847863997103583254
My Birthday!
"Another year older, another year to be grateful for all of you. Here's to health, happiness, and you all!"
35 Ends Today and 36 Begins!
Important Life Cycles 7x5=35 and 144/4=36!
Cheers!
🎂😍🙏
#birthday
Спасибо всем за поздравления 🥳
Стартует мой персональный, Новый год, полный любви, заботы и внимания!
У меня есть грандиозные планы по сделкам, но об этом пока промолчу
Хочу добавить в копилку еще 3-5 стран, где я не была
#birthday
🎉 Telegram becomes 9 years old!
In the 14th August of 2013, Telegram iOS, the first Telegram client appeared, and a few weeks later, Telegram Android came.
Over the past years, Telegram has announced 10 massive updates, including those which brought live streams, group video chats, reactions, web bots, video stickers, the emoji platform, and much more.
Alongside those, Telegram Premium and the advertisement platform were launched.
Telegram's mobile clients are currently at version 8.9.
#birthday
Today Telegram turns 11🎂
Pavel Durov, who set out with the idea of starting ‘a new era of messaging’ by bringing a new alternative to the messaging applications market, launched Telegram, which has almost one billion users today with the iOS version released exactly1️⃣1️⃣ years ago.
With the iOS version released on 13 August 2013 and the Android version released in October of the same year, secure, private and quality messaging became possible for everyone for free.
Happy birthday Telegram
Many more years to start a new era in messaging
» Check out Durov's post
#Birthday
👉The TG Times
🎉 Telegram menjadi 9 tahun!
Pada 14 Agustus 2013, Telegram iOS, klien Telegram pertama muncul, dan beberapa minggu kemudian, Telegram Android datang.
Selama beberapa tahun terakhir, Telegram telah mengumumkan 10 pembaruan besar-besaran, termasuk pembaruan yang menghadirkan streaming langsung, obrolan video grup, reaksi, bot web, stiker video, platform emoji, dan lebih banyak.
Selain itu, Telegram Premium dan platform iklan diluncurkan.
Klien seluler Telegram saat ini berada di versi 8.9.
#birthday
Today is August 14, Telegram's 10th birthday🔟
Telegram, A popular application that we use for hours a day, which is a wonderful way to communicate with others in the era of communication has turned 10 years old today🔟
Pavel Durov, the founder of Telegram, launched Telegram for iOS for the first time on August 14, 2013 and officially started its operation. Then in October of that year, the first version of Telegram for Android was made available to all users.
We now owe all our communications to Telegram❤️🔥
Durov's post about the birth of Telegram
#Birthday
👉The TG Times
🎉 Нам 15 лет!
🐝 RuFilms – это большое семейство пчелок. Естественно, мы заработались и забыли, что вчера, 6 ноября, у нас был юбилей!🎂
Каждый из вас вложил частичку души в наше любимое дело, а значит, и в эту компанию. Большое спасибо всем-всем нашим переводчикам, редакторам, менеджерам, руководителям и, конечно, основателям компании Алексею Козуляеву и Елене Конотоповой ❤️ Давайте и дальше делать искусство кино понятным для всех 📽
Пишите в комментариях, чем вас зацепила работа с RuFilms ✍️
🤗 А ещё мы очень любим собираться с вами вживую, поэтому вспоминаем, как это было в прошлом году:
https://www.youtube.com/watch?v=yyrS8TuiJ1U
#rufilms#birthday
🥳Bugun Telegram 10 yoshga to'ldi
⚡️ Atigi oʻn yil ichida Telegram 800 milliondan ortiq faol foydalanuvchilarga ega boʻldi. Yillar davomida ko'plab yangilanishlar va takomillashtirishlar orqali Telegram zamonaviy xabar almashish tajribasi qanday bo'lishi kerakligini qayta belgilab berdi.
📊 Telegram uchun navbatdagi qadam - bu xabar almashishdan tashqariga chiqish va umuman, ijtimoiy tarmoqlarda innovatsiyalarni rivojlantirish. Biz mashhurligimizdan milliardlab odamlarning hayotini yaxshi tomonga o'zgartirish, sayyoramizdagi odamlarni ilhomlantirish va ko'tarish uchun foydalanishimiz kerak.
📆 Bugun barcha foydalanuvchilar uchun hikoyalarning bosqichma-bosqich chiqarilishi Telegram tarixidagi ushbu yangi bosqichning boshlanishini anglatadi. O'tgan o'n yillik hayajonli bo'lsa-da, keyingi 10 yil Telegram o'zining haqiqiy salohiyatiga erishadigan vaqt bo'ladi 🥳 – deya habar beradi o'zining telegram kanalida Durov...
👉🏼Birinchi raqamli Windows Blog | #telegram / #birthday
🎉 Notcoin Community: Celebrating Notcoin’s Birthday!
#Notcoin#birthday
The Notcoin Community is celebrating Notcoin’s birthday with a series of events over the next few weeks. Expect gifts, stickers, games, and more as part of the festivities.
Source: link
@tonlines