Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Привет! Данияр на связи.
Поделюсь планами на следующие 3 года. Планы есть планы, это не обещания, они могут меняться, но на сегодня я вижу раскрытие вселенной в таком порядке. В скобках месяц завершения книги, ориентировочный, разумеется. Все это, конечно, довольно оптимистично для меня, но я постараюсь писать чаще и больше, чтобы уложиться в сроки, но не потерять в качестве.
• Крафтер-2 (ноябрь 2023)
• Сидус-3 (декабрь 2023)
• Дисгардиум-12.2 (декабрь 2023)
• Дисгардиум-12.3 (март 2024)
• Нокаут-3 (в соавторстве с Максом Лагно, 2024)
• Сидус-4 (апрель 2024)
• Крафтер-3 (май 2024)
• 99 мир — 3 (июль 2024)
• Кирпичи 3.0 (август 2024)
• Мета-2 (октябрь 2024)
• 99 мир — 4 (декабрь 2024)
• 99 мир — 5 (февраль 2025)
• Жатва душ — 2 (апрель 2025)
• Жатва душ — 3 (июль 2025)
• Мета-3 (сентябрь 2025)
• Селекция-1
• Селекция-2
• Селекция-3
• Второй мир — 1
• Второй мир — 2
• Второй мир — 3
«Нокаут-3» больше зависит от Макса, ему интересно, но у него свои серии. Как оба найдем время, расскажем историю от «Кирки» до «Сноусторма» + расскажем о Третьей мировой.
«Селекция» пока без точных сроков, зависит от того, как пойдут другие серии и вашего интереса. «Второй мир» — продолжение истории Луки Децисиму в новом мире. Название рабочее, потому что может так случиться, что это будет совершенно отдельная серия.
Так же я сейчас могу недооценивать свою графоманию и ошибиться в количестве томов серий.
#планы#levelup
Создай карту своих достижений
Для того, чтобы повысить свою мотивацию, особенно в сложные периоды жизни, хорошо заиметь карту достижений.
Делается она так:
📎Возьми лист бумаги, ручки, карандаши, маркеры. Хорошо, если ты знаешь, что такое mind map, можно воспользоваться таким сервисом.
📎Прочерти длинную линию и разбей ее на временные периоды (по 10 лет, по 5 или даже меньше).
📎После этого вспомни все свои достижения на каждом этапе жизни и нанеси их на бумагу.
📎К каждому пункту добавь слова или картинки, которые связаны именно с этим событием. Используй цветные маркеры!
📎Держи карту на видном месте. И в тот момент, когда все будет валиться из рук, или покажется, что все идет не так, она будет напоминать тебе, сколько всего ты уже смог достичь!
#levelup#improvingyourself
@selfdeprules
🔥 BU O‘YIN EMAS — BU PORTLASH.
2 kunlik adrenalin.
Cheksiz gaming.
Haqiqiy battle.
⚡ Bu yerda tomoshabin va faqat o‘yinchilar bor.
⚡ Bu yerda tasodif yo‘q — faqat mahorat gapiradi.
⚡ Bu yerda oddiylik yo‘q — faqat shov-shuv.
🚀 Sahna tayyor. Maydon qiziyapti.
SEN QACHON CHIQASAN?
—————————
🔥 THIS ISN’T A GAME — IT’S AN EXPLOSION.
2 days of adrenaline.
Unlimited gaming.
Real battles.
⚡ No spectators — only true players.
⚡ No luck — only skill speaks.
⚡ Nothing ordinary — only pure hype.
🚀 The stage is set. The arena is heating up.
WHEN DO YOU STEP IN?
#GameFest2026#LevelUp#BattleMode
🎮 Attention Gamers! 📸 Big 200 Go!Bots giveaway!! Capture Epic Moments and Win Big! 🏆
📢 Get ready for the ultimate gaming challenge! Introducing the 🌟 EA Games Screenshot Challenge 🌟 brought to you by Health Hero. 🎉 Show off your gaming skills, share your most jaw-dropping EA Games screenshots, and earn 💪 Health Hero rewards!
Starts: Tuesday, June 20, 2023
Ends: Tuesday, June 23, 2023
📸How to participate? Visit https://zealy.io/c/healthhero-7008/questboard to get your quests started!
📢 Don't wait! Grab your gaming gear, start snapping those jaw-dropping screenshots, and let the gaming magic begin! 🚀✨
📢 Disclaimer: This challenge is purely for gaming enthusiasts and is not endorsed or affiliated with EA Games. It's all about celebrating our shared love for gaming and having a blast together!
🎮📸#GamingHeroes#EAGameScreenshotChallenge#HealthHero#CaptureTheMoment#LevelUp#GameOn
@Axenia_Bot
Qué puede hacer este bot?
Este bot puede contar los puntos de karma en grupos. Escriba '+' para subir o '-' para reducir puntos al usuario que responde.
Idioma: Inglés, Ruso, Ucraniano, Uzbeco, Turco
(visto en @BotsGram_cu)
#karma, #ranking, #points, #toplist, #stats, #statistic, #inline, #levelup, #group, #top, #analytic, #statistics, #statistics, #member, #member, #groups, #activity