Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Biznes va tadbirkorlik oliy maktabida ingliz tili va biznes muloqot ko‘nikmalarini rivojlantirishga bag‘ishlangan seminar-trening bo‘lib o‘tdi
🇺🇿 Biznes va tadbirkorlik oliy maktabida “Ingliz tili va biznes muloqot ko‘nikmalarini rivojlantirish” mavzusida seminar-trening o‘tkazildi.
Seminar-treningning mehmoni ingliz tili bo‘yicha xalqaro ekspert, pedagog va tadqiqotchi, “Tashkiliy innovatsiyalar” yo‘nalishi bo‘yicha pedagogika fanlari doktori Juzeppe Kiaramonte bo‘ldi.
Tadbir interfaol formatda tashkil etilib, unda ishtirokchilarga ingliz tilida, ayniqsa, og‘zaki nutq ko‘nikmalarini rivojlantirishga qaratilgan turli amaliy faoliyat turlari taqdim etildi. Shuningdek, ushbu ko‘nikmalarni biznes muloqot jarayonlarida samarali qo‘llash bo‘yicha tavsiyalar berildi.
Mashg‘ulot davomida tinglovchilar faoliyat yuritayotgan sohalaridagi real keyslar asosida muhokamalarda ishtirok etib, amaliy topshiriqlar orqali kommunikativ kompetensiyalarini mustahkamlash imkoniga ega bo‘ldilar.
Tadbir yakunida ishtirokchilar bunday seminar-treninglarni kelgusida muntazam o‘tkazib borish muhimligini ta’kidladilar.
🇷🇺RU
🇬🇧ENG
#GSBE#GraduateSchool#Masterclass#Englishlanguage
🔝Web-site |🔝Facebook | 🔝Instagram | 🔝Youtube
Наше Образовательное учреждение с гордостью объявляет о проведении международной олимпиады по английскому языку "Hippo"! Это уникальная возможность для всех учащихся продемонстрировать свои знания и навыки в английском языке. 📚✨
Олимпиада "Hippo" - это не только соревнование, но и отличный шанс для обмена знаниями, встречи с новыми людьми и получения незабываемого опыта. Мы приглашаем учеников всех возрастных категорий принять участие и показать свои лучшие языковые способности. 🌍🏆
🔹 Регистрация открыта до 2 декабря.
Присоединяйтесь к нам в этом увлекательном путешествии в мир английского языка! 🎉
#HippoOlympiad#EnglishLanguage#InternationalCompetition
If you have any questions, do not hesitate to contact us☎️
+998742261078 | +998742281121 | +998958505111 | +998742276163 | +998742252536 | +998952017878
or write on Telegram @admofadc
🎉Happy Birthday to Samora “Sam” Poswa, a citizen of South Africa🇿🇦 who lives and works in Yekaterinburg!
🎓Sam Poswa teaches English at the EnglishFit language school and has already introduced hundreds of Yekaterinburg residents to the culture and traditions of South Africa🌍
📚 Learn more about Sam’s activities:
— https://t.me/sarconsulurals/1575
— https://t.me/sarconsulurals/1489
— https://t.me/sarconsulurals/1443
🔗 His VK page:
https://vk.com/id524313855
🎂 Wishing Sam good health, inspiration, professional success, and many exciting new projects ahead!
#SouthAfrica#SamPoswa#Yekaterinburg#EnglishLanguage#CulturalExchange#Education
Do you know someone who always thinks that everyone else has a better life than them?! 🙄😅 Scroll through the images to find out how to use ‘the grass is always greener on the other side’ 🌱, and don’t forget to answer the questions on the last slide!
EXTRA: Could walking 7,000 steps a day could improve your mental health? 🚶 Click the link in our bio to find out and learn some useful vocabulary in the process! 📰💚
Image: Getty
#vocabulary#learnenglish#englishlanguage#expression#idiom#proverb#englishclass#speakenglish
You know when somebody just WON’T change their ways? 😠 We’ve got an English expression for that! ✅
Scroll through the images to find out how to use ‘You can’t teach an old dog new tricks.’ ❌🐶
Can you use it in a sentence – and do you have a similar expression in your language? 👇👇👇
MORE: If you'd like to learn some more animal idioms, like 'rabbit on 🐰' or 'as sick as a parrot 🦜', click the link in our bio!
Image: Getty
#trick#proverb#learnenglish#vocabulary#learnenglish#englishlanguage#expression#idiom#englishclass#speakenglish
😱 Oh no!!! There’s a mistake in this sentence. Do YOU 🫵 know what’s wrong? We’ll tell you the answer later! (Image: Getty)
MORE: Click the link in our bio for a quick video tutorial about this topic ☝️☝️☝️
#learnenglish#quiz#englishlanguage#grammar#vocabulary#spotthemistake#spottheerror#mistake#error#learnenglish