Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🌎 An ancient mystery lingers at the center of our galaxy—a supermassive black hole called Sagittarius A*. Its powerful gravity bends space and time, hiding beyond a swirling cloud of stars and gas. This invisible giant shapes the Milky Way, anchoring everything around it with immense, unseen force. ✨
#space⚡#blackhole⚡#universe
👉subscribe Interesting Planet
🌎 In 2020, astronomers detected a mysterious object named “The Cow,” a fast and extremely bright stellar explosion. Unlike normal supernovas, “The Cow” rapidly peaked in brightness, confounding scientists. Follow-up observations revealed it was likely the birth of a black hole or neutron star—providing a rare view of a star’s collapse in real time. ✨
#astronomy⚡#supernova⚡#blackhole
👉subscribe Interesting Planet
👉more Channels
BlackHole
Music Player made with Flutter
Features
Best Streaming Quality (320kbps)
Music Search
Trending Songs
Support 15+ music languages
Local and Global Top Spotify songs
Add Songs to Favorite
Playlists support
Import Playlists from Spotify
Sleep timer
Lyrics Support
Listening history record
Dark mode / accent color
Download for offline play (320kbps with ID3 tags)
Play Online as well as Offline Songs
Queue Management
Auto Update Check
Cache support
No Subscription
No Ads
More to come...
Download https://github.com/Sangwan5688/BlackHole/releases
Channel @blackhole_channel
Group https://t.me/joinchat/fHDC1AWnOhw0ZmI9
#BlackHole#Music#Player
🌎 At the center of our Milky Way galaxy lies Sagittarius A*, a supermassive black hole around 4 million times the mass of the Sun. It exerts a powerful gravitational pull, causing nearby stars to orbit at incredible speeds—some over 5,000 kilometers per second. ✨
#astronomy⚡#blackhole⚡#galaxy
👉subscribe Interesting Planet
👉more Channels
🪐 The galaxy NGC 1277 in the Perseus constellation harbors an ultramassive black hole that makes up a staggering 14% of its entire mass—a proportion far greater than in any typical galaxy. This enigmatic black hole has puzzled scientists, as such a gigantic ratio defies cosmic norms and hints at a forgotten chapter in the history of galactic evolution. ✨
#galaxies⚡#blackhole⚡#mystery
👉subscribe Universe Mysteries
🪐 The dusty core of the elliptical galaxy Centaurus A (NGC 5128) hides a colossal jet of high-energy particles, launched from a supermassive black hole and stretching over 1 million light-years into intergalactic space. X-ray and radio images reveal this jet carving through the surrounding gas, shaping the galaxy’s strange appearance and fueling vast lobes that glow in the cosmic void. ✨
#CentaurusA⚡#blackhole⚡#galaxy
👉subscribe Universe Mysteries
🪐 In the galaxy SDSS J135154.46+132719.1, astronomers have observed a striking phenomenon: a supermassive black hole that was caught being "kicked" out of its galaxy at nearly 7.5 million kilometers per hour. This cosmic eviction is thought to be caused by the merged black holes’ gravitational waves pushing the giant object away—an extreme event where the very heart of a galaxy is flung into intergalactic space. ✨
#phenomena⚡#galaxy⚡#blackhole⚡#nasa⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
🌎 Deep within the constellation Cygnus, the black hole V404 Cygni occasionally unleashes powerful outbursts, ejecting matter at near light-speed in opposing jets. These rare events are so energetic that the black hole briefly outshines its entire host galaxy, offering a fleeting glimpse into the turbulent ballet around stellar remnants. ✨
#blackhole⚡#cygnus⚡#jets
👉subscribe Universe Mysteries
🪐 In the Perseus Cluster, a supermassive black hole at the center of the galaxy NGC 1275 sends out powerful sound waves that ripple through the surrounding gas. These cosmic vibrations have wavelengths so vast—spanning around 30,000 light-years—that they produce the deepest note ever detected, 57 octaves below middle C, making it a real, albeit inaudible, “song” of the universe. ✨
#PerseusCluster⚡#blackhole⚡#astronomy⚡#nasa⚡#galaxy⚡#stars⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries