Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Китайский бренд VidaBay выпустил магниты на холодильник, в которые можно загружать фотографии со смартфона.
Внутри находится дисплей наэлектронных чернилах, благодаря которому появляется эффект полароида, а сами фото передаются со смартфона через NFC. Батарейки нет — энергия берётся прямо при передаче изображения. Изображение просто «застывает», не требуя ни питания, ни зарядки.
Стоит такое устройство 36 долларов
r/#interesting
#interesting
🐝 After discovering a food source, bees communicate it to others through a “dance.” The dance provides precise information about direction and distance, which has been confirmed by experiments. One type of dance is used for nearby locations, and another type for distant ones. Even when the sun is not visible, they can determine direction using certain light spectra.
☘️Read the latest environmental news on the @ekologuz page. Follow us and send your suggestions and wishes via @eklguz_bot
Instagram | Facebook | Twitter | Sayt | Youtube.
Стэнли Кубрик в своём последнем фильме «С широко закрытыми глазами» показал реальную жизнь элит и предсказал дело Эпштейна — такая теория сейчас набрала популярность в сети.
В фильме герой случайно попадает на тайную элитную оргию с масками, ритуаламии безнаказанностью, понимая, что он увидел мир, в который ему вход закрыт.
Согласно теории, это скрытая метафора реальных элитных сетей сексуальной эксплуатации, которые сейчас всплывают в материалах по Эпштейну.
Масло в огонь подлил Роджер Эвери, являющийся учеником Кубрика. Он рассказал, что первоначальныйсценарий фильма был посвящен обнаружению элитной педофильской сети. После просмотра монтажной версии фильма студия потребовала удалить упоминания о педофилии. Кубрик пытался защитить свой фильм, новнезапно погиб за несколько дней до премьеры.
r/#interesting
The Hungarian Parliament in Budapest is a stunning landmark on the Danube. Completed in 1904, it features a grand dome, intricate details, and a mix of Neo-Gothic, Renaissance, and Baroque styles.
@Viral_Today / #interesting
Karl Griesbaum’s singing bird boxes, made since 1905, use a tiny bellows and whistle system to create lifelike birdsong while a mechanical bird moves. These rare antiques, often in gilded brass or enamel, can sell for $2,000–$10,000+ today.
@Viral_Today / #interesting
Pulse Island on Lulu Island, Abu Dhabi, is an interactive light installation by Rafael Lozano-Hemmer, visualizing participants’ heartbeats with 4,000 synchronized light bulbs.
@Viral_Today / #interesting
Perchten are devil-like figures from Alpine regions of Austria and Bavaria who parade through the streets in the winter in an ancient folk tradition.
They look scary on purpose to drive away evil spirits and bring good fortune.
@Viral_Today / #interesting
This powerful visual shows a year’s worth of diabetes supplies for managing type 1 diabetes—every sensor, pump site, and vial of insulin
@Viral_Today / #interesting
Traditional Chinese rice paper making. Machines can’t replicate the delicate touch and skill needed to create rice paper, essential for fine Chinese art and calligraphy.
@Viral_Today / #interesting
🌈 Rainbows aren’t actually bows—they’re cones! What we see as a bow is just the visible part of a much larger cone of light. Fun fact: rainbows move with the sun, meaning you might be standing over a potential rainbow at some point every day!
@Viral_Today / #interesting
This century-old machine might look terrifying, but it’s actually a self-playing piano powered by vacuum suction! By carefully pumping air out, it controls the keys to play music all on its own.
@Viral_Today / #interesting