Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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 Pascagoula UFO Encounter
Interview and Documentary
The Pascagoula Abduction was an alleged UFO sighting and alien abduction in 1973, in which Charles Hickson and Calvin Parker claimed they were abducted by aliens while fishing near Pascagoula, Mississippi.
#aliens
AETATESOLIS
🪐 In 2023, scientists used the James Webb Space Telescope to study the atmosphere of the exoplanet K2-18b, located about 120 light-years away in the constellation Leo, and detected molecules like methane and carbon dioxide in its thick atmosphere. While this doesn't prove the existence of aliens, these chemicals are considered potential signs that could support life as we know it, making K2-18b one of the most intriguing worlds in the ongoing search for extraterrestrial life. ✨
#aliens⚡#exoplanets⚡#astronomy⚡#nasa⚡#galaxy⚡#stars⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
🪐 In 2015, scientists discovered a mysterious star called KIC 8462852, also known as "Tabby's Star," located about 1,470 light-years from Earth. This star shows unusually irregular and dramatic dimming events, with its brightness sometimes dropping by more than 20%, sparking curiosity because no natural explanation fully accounts for the strange pattern—though telescopes have found no evidence that the cause is artificial or linked to aliens. ✨
#aliens⚡#mysteries⚡#stars⚡#nasa⚡#galaxy⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
Project Bluebeam
Final Stage👽
DON'T TAKE THE BAIT
THEY WILL ENGINEER
THE RAPTURE AS AN ALIEN
ABDUCTION
#ufo#uap#aliens#disclosure#trump
https://t.me/TheSecretArchivesQ
🪐 In 2020, researchers using the LOFAR radio telescope detected strange bursts of low-frequency radio waves coming from the red dwarf star GJ 1151, about 26 light-years from Earth. These signals are thought to be created by interactions between the star and an orbiting planet, and while not proof of aliens, such emissions spark excitement because similar interactions could reveal planets that might host life. ✨
#aliens⚡#exoplanets⚡#radio⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries