Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🪐 Just 12 light-years away, the red dwarf star Teegarden’s Star hosts two Earth-sized exoplanets, Teegarden’s Star b and c, both located in the star’s habitable zone. This zone is the area around a star where temperatures could allow liquid water to exist—a key ingredient for life as we know it—making these planets some of the most intriguing nearby candidates in the search for life beyond our solar system. ✨
#exoplanets⚡#habitablezone⚡#astrobiology⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
🪐 The exoplanet K2-18b, located about 120 light-years away in the constellation Leo, has been found to possess water vapor in its atmosphere—making it one of the few known exoplanets within its star’s habitable zone where conditions might allow liquid water. K2-18b is a "mini-Neptune," meaning it’s larger than Earth but smaller than Neptune, and its potential for moderate temperatures and watery clouds raises the possibility that life-friendly environments could exist beyond our solar system. ✨
#exoplanets⚡#life⚡#habitablezone⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
👉more Channels
🪐 Deep in the constellation Aquarius, astronomers have discovered exoplanet K2-72e orbiting a cool red dwarf star roughly 227 light-years from Earth. K2-72e is a rocky world located within its star’s habitable zone—the region where temperatures might allow liquid water on the surface—making it another intriguing candidate in the search for planets that could support life beyond our solar system. ✨
#exoplanets⚡#habitablezone⚡#discovery⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
🪐 Astronomers have identified Proxima Centauri b, an Earth-sized exoplanet orbiting the closest star to our Sun, as one of the nearest spots where life could possibly exist. Sitting in its star's "habitable zone"—the region where temperatures might allow liquid water—this world offers a natural laboratory to explore the potential for life beyond our solar system. ✨
#exoplanets⚡#habitablezone⚡#discovery⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
🪐 The exoplanet TOI-700 d, orbiting a small, cool star about 101 light-years away in the constellation Dorado, lies within its star’s “habitable zone,” where temperatures might allow water to exist as a liquid on the surface. This rocky world is similar in size to Earth and is one of the few confirmed planets outside our solar system where scientists believe the conditions could be just right for life as we know it to survive. ✨
#exoplanets⚡#habitablezone⚡#dorado⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
👉more Channels
🪐 Over 42 light-years from Earth, the exoplanet Tau Ceti e orbits within the habitable zone of its Sun-like star—meaning it receives just the right amount of energy that could allow liquid water to exist on its surface. While Tau Ceti e is about 60% larger than Earth and its true environment remains a mystery, its location around one of our closest stellar neighbors makes it a real and intriguing candidate in the search for life beyond our solar system. ✨
#exoplanets⚡#habitablezone⚡#lifebeyondearth⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
👉more Channels
🪐 Astronomers have identified the exoplanet Wolf 1069 b, located about 31 light-years away in the constellation Cygnus, as a promising place where life could exist. This rocky planet orbits in its star's habitable zone—the region where temperatures may allow liquid water to pool on the surface—making it one of the most intriguing nearby candidates in the search for life beyond our solar system. ✨
#exoplanets⚡#habitablezone⚡#wolf1069b⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries