Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🌎 Scientists researching the mysteries of parallel worlds often reference "brane theory," which suggests our universe could be a 3D surface, or 'brane,' floating in higher-dimensional space. In this model, multiple branes—each a universe with its own laws—could exist, and gravity may leak between them, which physicists are testing with experiments at facilities like CERN. ✨
#physics⚡#universe⚡#dimensions
👉subscribe Interesting Planet
👉more Channels
🌎 The concept of "extra dimensions" in physics comes from string theory, which requires at least 10 dimensions for its mathematical consistency. While these extra dimensions could allow for parallel universes, none have been directly detected. Experiments like those at CERN look for signs such as missing energy that might hint at hidden dimensions. ✨
#physics⚡#stringtheory⚡#dimensions
👉subscribe Interesting Planet
👉more Channels
🌎 The concept of higher dimensions beyond the familiar three of space and one of time appears in advanced physics, especially string theory. String theory mathematically requires up to 10 or 11 dimensions to explain gravity and fundamental particles. These extra dimensions are thought to be compact and hidden, possibly curled up at sizes far smaller than atoms. ✨
#dimensions⚡#stringtheory⚡#physics
👉subscribe Interesting Planet
👉more Channels
🌎 In 2022, a study using gravitational wave detectors like LIGO examined whether ripples from colliding black holes hinted at hidden dimensions. The research found no evidence for extra spatial dimensions, setting new constraints on theories that propose parallel universes. ✨
#physics⚡#blackholes⚡#dimensions
👉subscribe Interesting Planet
👉more Channels
🌎 The "brane multiverse" is a scientific idea suggesting our universe might be a three-dimensional "brane" floating in higher-dimensional space. Some versions of string theory propose multiple branes could exist close together, and rare collisions might even trigger new big bangs. The concept arises from efforts to unify gravity with quantum physics. ✨
#multiverse⚡#dimensions⚡#stringtheory
👉subscribe Interesting Planet
🌎 Physicists are searching for evidence of extra dimensions that could exist alongside our three spatial dimensions and time. Experimental efforts, like those at the Large Hadron Collider, look for signs such as missing energy or unusual particle behavior that might indicate the presence of dimensions beyond the familiar four. So far, no direct evidence has been found for extra dimensions. ✨
#physics⚡#dimensions⚡#experiment
👉subscribe Interesting Planet
👉more Channels
Тема шестого дня — картографирование за пределами 2D.
Эту работу подготовил наш коллега @Oreshulya для личного проекта. На карте изображён подводный рельеф небольшого озера Уайтфиш в Канаде. При создании использовалось ПО QGIS для получения картографических данных и Blender 3D для их визуализации.
Основной задачей было показать батиметрические данные в трёхмерном виде, что проблематично сделать с использованием стандартных средств ГИС. Способом изображения для этого была выбрана послойная окраска. Благодаря тому что каждый слой помимо уникального цвета имеет разную высоту в пространстве, создаётся ощущение объёма и глубины, которое на стандартных двумерных батиметрических картах достигается с помощью способа Танака (освещённых горизонталей).
#30DayMapChallenge#Day6#Dimensions#Cartography#GIS