Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Qadrli ustoz va murabbiylar!
💟Bugungi ulug‘ va qutlug‘ kunda sizlarga cheksiz minnatdorlik bildiramiz. Sizning mehr va zahmatingiz, tinimsiz izlanish va sabr-toqatingiz bilan jamiyatimizda ma’naviyat va ma’rifat ziyosi yorib turibdi.
Siz faqat bilim emas, balki hayot saboqlarini ham o‘rgatasiz, har bir shogirdga qanot bag‘ishlaysiz, ularni oliy maqsadlarga etaklaysiz. Sizning mehribon dilingiz va g‘amxo‘rlikka to‘la qalbingiz biz uchun beqiyos qimmatdir.
Har bir shogird yutug‘i — siz uchun sharaf, har bir muvaffaqiyat — siz uchun iftixordir. Sizga sog‘lik-omonlik, tinch va barqaror hayot, shogirdlaringiz esa sizga doimiy iftixor olib kelsin!
👏O‘qituvchi va murabbiylar kuni muborak bo‘lsin!
Уважаемые учителя и наставники!
🔴В этот великий и благословенный день мы выражаем вам безграничную благодарность. Благодаря вашей доброте и труду, неустанному поиску и терпению, в нашем обществе сияет свет духовности и просвещения.
Вы учите не только знаниям, но и жизненным урокам, даете крылья каждому ученику, ведете его к высоким целям. Ваше доброе и заботливое сердце бесценно для нас.
Каждый успех ученика - это честь для вас, каждый успех - это гордость для вас. Пусть вам сопутствуют здоровье и благополучие, мирная и стабильная жизнь, а ваши ученики - вечная гордость!
🎉С Днём учителей и наставников!
#GraduateSchool#Teachers#Mentors#Day
🔝Web-site |🔝Facebook | 🔝Instagram | 🔝Youtube
Hurmatli Ustozlar!
🟨 Ushbu qutlug‘ kunda sizlarga bebaho mehnatingiz, sabr-toqatingiz va fidoyiligingiz uchun chuqur minnatdorchilik bildiramiz.
Siz shunchaki bilim bermaysiz – siz har bir tinglovchini ilhomlantirasiz, qo‘llab-quvvatlaysiz va salohiyatini shaxsiy o‘sishiga yordam berasiz.
Sizning sa’y-harakatlaringiz kelajakni yaratadi, sizning donoligingiz va g‘amxo‘rligingiz bir umr qalbimizda.
🟪O‘qituvchi va murabbiylar kuni muborak! Erishgan natijalaringiz sizga quvonch va faxr olib kelsin!
Дорогие учителя и наставники!
⬛️ В этот особенный день хочется выразить вам слова глубокой благодарности за ваш неоценимый труд, терпение и преданность делу.
Вы не просто даёте знания — вы вдохновляете, поддерживаете и помогаете раскрыть потенциал каждого слушателя.
Ваши усилия создают будущее, а ваша мудрость и забота остаются в сердцах на всю жизнь.
🔴С Днём учителя и наставника! Пусть каждый день приносит вам радость и гордость за ваши достижения!
#GraduateSchool#Teachers#Mentors#Day
🔝Web-site |🔝Facebook | 🔝Instagram | 🔝Youtube
How COVID-19 Created Opportunities for Teachers and Students - https://campustechnology.com/articles/2021/05/05/how-covid-19-created-opportunities-for-teachers-and-students.aspx#Online#Education#Teachers#Students#Technology#COVID19@OnlineEducation10
When kids have big emotions, we tend to think they are being overly sensitive, that they need more resilience. Most of the time it is because there is a lot happening for the child that we can't see and don't know, that is pushing them beyond their means of coping. Instead we can change the response from they are overreacting, to seeing a child who has a lot happen for them, they are doing the best they can. They need our help not judgement.
#parenting#positiveparenting#gentleparenting#resilience#respectfulparenting#psychologist#play#playtherapy#childdevelopment#childtherapy#parentingtips#teachers#asd#family#life#adhd#mumlife#momlife#dads#consciousparenting
https://www.instagram.com/p/Ctd93W8vEM9/