Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
📺- CONTROL DE AEROPUERTOS: USA -📺
Título original: To Catch a Smuggler
Género:#Reality
Temporadas: 9 📡
Año: 2020 - Presente
Origen: EEUU 🇺🇸
Tráiler: youtu.be/nzuvwHLShEQ
Sinopsis:
Una serie que explora las historias cargadas de intensidad y emociones protagonizadas por la patrulla aduanera de Estados Unidos en algunos de los aeropuertos más concurridos del mundo por millones de pasajeros diariamente. Desde el Aeropuerto Internacional de Los Ángeles, Aeropuerto La Guardia y el Aeropuerto John F. Kennedy, entre otros. Descubra cómo se capturan a estos traficantes y sus cargamentos escondidos en lugares nunca imaginados.
Disponible:Disney+
@SeriesClubHD
🎥- EL GRAN BRUNCH -🎥
Título Original: The Big Brunch
Género:#Reality
Temporadas: 1 📼
Año: 2022
Origen: EEUU 🇺🇸
Tráiler:dai.ly/x8fe8e2
Sinopsis:
The Big Brunch es una serie de competencias de cocina que celebra las voces culinarias más inspiradoras y desconocidas del país.
A los chefs se les ofrecerá la oportunidad de compartir sus historias y sus sueños comerciales, al mismo tiempo que competirán por un premio que les cambiará la vida. Todo mientras busca formas innovadoras y personales de redefinir lo que significa cenar entre las 11 a.m. y 3 p.m. La serie, además de dar a conocer chefs busca ser la oportunidad de que todo el mundo se dé cuenta de que tienen al menos un amigo, un familiar o un compañero de trabajo que es extraordinario en lo que hace y lo positivo que es, poder apoyarlo en la búsqueda de sus sueños.
Disponible:Max
@SeriesClubHD
📺- IN THE EYE OF THE STORM -📺
Título Original: In The Eye of the Storm
Género:#Reality
Temporadas: 1📡
Año: 2024
Origen: EEUU 🇺🇸
Tráiler: youtu.be/BdMJ3G9Otqw
Sinopsis:
Desde tornados hasta incendios forestales, las imágenes inmersivas capturan el epicentro de impactantes desastres naturales en tiempo real como nunca antes.
Disponible:Movistar+ | Max
@SeriesClubHD
📺- LA CASA DE EMPEÑOS -📺
Título original: Pawn Stars
Título Alternativo: Estrellas del Empeño
Género:#Reality#Comedia
Temporadas: 17 📡
Año: 2009 - Presente
Origen: EEUU 🇺🇸
Tráiler: youtu.be/S46rcW5ADV4
Sinopsis:
Rick Harrison y su familia poseen y dirigen una casa de empeños en Las Vegas. Compran, venden y tasan artículos de valor histórico.
Disponible:A Tres Player | TiviFy
@SeriesClubHD
🎥- CATFISH: MENTIRAS EN LA RED -🎥
Título Original: Catfish: The TV Show
Género:#Reality#Romántica#Drama#Documental
Temporadas: 9 📼
Año: 2012 - Presente
Origen: EEUU 🇺🇸
Tráiler:youtu.be/JbQyoH819rM
Sinopsis:
Nev Schulman y Max Joseph ayudan a las personas que se han enamorado en Internet a comprobar la autenticidad de la identidad de sus amantes.
Disponible:Pluto TV | Movistar+ | Paramount+
@SeriesClubHD