Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🍿 The Magic Behind 'John Wick 4': Action Without Limits#BehindTheScenes
Keanu Reeves took his commitment to the max for 'John Wick 4', undergoing 12 weeks of intense training to perform unprecedented action scenes. 🚗🔫 A standout sequence features him driving a car without doors or a windshield through the Arc de Triomphe, all while shooting!
Cinematographer Dan Laustsen chose vibrant colors and ARRI Large Format cameras to capture the essence of locations like Osaka and Paris. Chad Stahelski, the genius behind 'John Wick', meticulously coordinated each fight, ensuring realism and spectacle. Each scene is a visual masterpiece that elevates action cinema to new heights. 🎬💥
📹 Don't miss the behind-the-scenes video here. You'll be amazed at how this action marvel was made!
> #𝘴𝘦𝘳𝘪𝘦𝘴 · 🚀𝘣𝘰𝘰𝘴𝘵
From the Forge #01 — Early sketches of our central crafting system
Hey! We’ve been diving deep into early sketches for one of the key elements in DeckForge — the Forge.
This is the place where something important is being created... but we won’t spoil the details just yet..
Right now:
🔵We're testing visual concepts for the core mechanism
🔵Exploring how materials, energy and crafting logic come together
🔵Prototyping tools like hammers, crystals, and tech-infused devices
This is just the start — most of what you see is raw and mid-process.
But that’s exactly what makes it fun — sharing how it really looks behind the scenes.
#DeckForge#BehindTheScenes
Join the DeckForge Community:
🌐YouTube𝕏Twitter🎮Discord
👉Chat👉Announcements
From the Forge #14: 🔨 | Premium Shop Incoming
Forgers, our team is working on one of the most important features — the in-game Premium Shop
This is where your progress, dedication & $BOOMS holdings will really start to shine.
Based on your activity and tokens, you’ll unlock exclusive Founder Tiers of rewards — packs that will never be available again once the official release.
What does this mean for you?
🔵You’ll be able to claim your Founder Packs & open them once the full release is live
🔵We’re still very early, which means your progress and feedback are critical for shaping the future of DeckForge
Big updates are coming. September will be full of surprises, new features & major announcements. Stay tuned — the best is yet to come.
➡️ Don’t forget: claim your rewards in Discord and secure your special roles. They’ll be more valuable than you think…
Stay Forged.
#DeckForge#ClosedBeta#BehindTheScenes
Join the DeckForge Community:
🌐YouTube𝕏Twitter🎮Discord
👉Chat👉Announcements👉DeckForge
«Говорят, из моего «Назад в будущее» мог бы получиться неплохой мюзикл. Не хочу убедиться в этом при жизни».
Сегодня исполнилось 73 года Роберту Земекису.
#ВИДЕОТЕКА
#RobertZemeckis
#BehindTheScenes
Йост Вакано, ASC, держит свой собственный ARRI IIC на борту подводной лодки во время съемок душераздирающей драмы Второй мировой войны Das Boot (1981) . Рядом с ним первый AC Питер Майвальд, держащий дистанционное управление. «Гламур и очевидная техническая гладкость не имели места в фильме», - написал Вакано в «American Cinematographer». «Камера должна была подчиняться тем же ограничениям, что и актеры. Требование чрезвычайной мобильности в узких пределах лодки не позволяло даже использовать стедикам. Это должна быть ручная камера! » #newsfidllercom#новости#засценой#bts#behindthescenes
Фильм называется "Подводная лодка", рейтинг кинопоиска 8.1 бюджет 14 млн долларов, сборы в США 11 млн. долларов
«Понятие независимости — относительное. Вас нельзя назвать независимым, если вы не снимаете кино за свой собственный счет, чего в здравом уме никто не делает».
Сегодня Джиму Джармушу исполнилось 73 года.
#ВИДЕОТЕКА
#JimJarmusch
#ДжимДжармуш
#BehindTheScenes
📷🎬🎸 Майкл Джей Фокс репетирует знаменитую сцену на съемках фильма «Назад в будущее». Сегодня нашему любимому актеру исполнилось 64 года.
#ВИДЕОТЕКА
#MichaelJFox
#BackToTheFuture
#BehindTheScenes