Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🔵🔴Pacto de pareja de Mapi León y Engen para la final de Oslo
Mapi León e Ingrid Engen vivirán una final de Champions League muy especial el próximo sábado en Oslo. Las futbolistas de Barça y OL Lyonnes mantienen una relación sentimental tras coincidir como azulgranas durante cuatro temporadas, pero desde el pasado verano tomaron caminos distintos que les han obligado a mantener... #Barça#FCB
🤕El Dr. Surós, experto en medicina deportiva, analiza la lesión de Fermín: "Yo lo descartaría"
El FC Barcelona, tal y como avanzó Mundo Deportivo, anunció este lunes que Fermín López tendrá que ser intervenido de una fractura en el quinto metatarsiano del pie derecho, algo que le descarta para el Mundial de Estados Unidos, México y Canadá que se inicia el próximo mes de junio. #Barça#FCB
🔵🔴El césped del Ullevaal, del drama a la calma para la final de la Champions femenina
El 31 de marzo se jugó un amistoso masculino Noruega-Suiza (0-0) en el Ullevaal Stadion de Oslo en el que sólo se habló del pésimo estado del césped y provocó un mediático debate en Noruega porque peligró el estado físico de cracks como Erling Haaland y Alexander Sorloth, que son la esperanza del país en el regreso a... #Barça#FCB
🔵🔴La Agencia Tributaria concluye que los pagos a Negreira no eran para pagar árbitros
La Dependencia Regional de Inspección de Cataluña de la Agencia Tributaria ha emitido un informe en el que concluye que los pagos realizados a José María Enríquez Negreira, vicepresidente del Comité Técnico de Árbitros (CTA), procedentes del FC Barcelona no fueron para pagar árbitros ni influir en los resultados... #Barça#FCB
🔵🔴Lamine cumplió el sueño del hijo de Antony
Lamine Yamal (18 años) es uno de los jugadores más admirados del mundo, en especial entre los más jóvenes, y así quedó patente durante el Barça-Betis. La estrella verdiblanca Antony le pidió al joven crack azulgrana si podía conocer a su hijo y Lamine accedió para cumplir con el sueño del pequeño. #Barça#FCB
🔵🔴Las cifras del OL Lyonnes en la Champions revelan el liderazgo de Engen y el peligro de Dumornay
El OL Lyonnes vuelve a situarse, una vez más, en el escenario que mejor conoce: la gran final de la UEFA Women’s Champions League. El conjunto francés, referencia histórica del fútbol femenino europeo y máximo ganador de la competición, se medirá este sábado 23 de mayo (18. #Barça#FCB
⚽Espectacular récord europeo del Barça en tres estadios distintos
Los dos goles de Raphinha y el último de Joao Cancelo certificaron el inédito pleno de 19 victorias de 19 posibles del Barça como local en el Campeonato de Liga. Lo curioso del caso es que han sido tres estadios los escenarios para ello: dos partidos en el Estadi Johan Cruyff, tres en el Olímpic Lluís Companys y 14 en... #Barça#FCB
🔵🔴Flick: "Queremos más títulos, quizás también la Champions"
Hansi Flick mostró su felicidad tras firmar como entrenador hasta 2028, con otra temporada opcional, y exhibió ambición de cara al futuro: "El objetivo es ganar más títulos, quizás también la Champions, trabajaremos para eso, para que el sueño se cumpla", manifestó en las oficinas y a medios del club barcelonista. #Barça#FCB
🔵🔴Oficial: Flick firma hasta 2028 con otra temporada opcional
Hansi Flick firmó el contrato que le liga al Barcelona hasta 2028, más otra temporada opcional, en un acto privado celebrado en las oficinas del club, con el presidente del FC Barcelona, Rafa Yuste; el presidente electo, Joan Laporta; el director deportivo, Deco; y los miembros de la Comisión Deportiva. #Barça#FCB
🔵🔴Emilio Bernad no continuará en el Barça Atlètic
El sueño de Emilio Bernad (26 años) ha llegado a su fin. El portero valenciano lo cumplió a finales del verano pasado, cuando con el mercado a punto de cerrarse el Barcelona le llamó para reforzar la portería del filial. #Barça#FCB
🔵🔴Los trofeos de LaLiga y la Supercopa 2025-26 ya están en el Museu
Los trofeos de la Liga y la Supercopa de España de la temporada 2025-26 ya están en el Museu del FC Barcelona. Poco antes del acto de la firma de la renovación de Hansi Flick las llevaron al Museu el técnico alemán; el capitán de la plantilla, Ronald Araujo; y el presidente del club y el presidente electo, Rafa Yuste... #Barça#FCB
🔵🔴Flick, impactado por el nivel de Abde
El nivel de Ez Abde, actualmente la principal estrella del Betis en su temporada de su definitiva consagración en la élite, dejó impactado a Hansi Flick, técnico del Barça, según informó 'Què t,hi jugues' de SER Catalunya. #Barça#FCB