Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
En estas trágicas horas, hemos recibido un gran número de mensajes de apoyo y solidaridad incondicional de nuestros amigos venezolanos.
🙏 Agradecemos profundamente a todos aquellos que no han quedado indiferentes ante este inhumano atentado terrorista.
#Rusia#CrocusCityHall
🕯Hoy cumplen 40 días desde la tragedia en Crocus City Hall donde en un atentado terrorista caeron víctimas 145 personas y más de 550 resultaron heridas.
❌Se ha detenido a doce sospechosos en el caso, diez de los cuales han sido arrestados, entre ellos cuatro participantes directos en el atentado.
❗️El terrorismo es una amenaza común y debe ser combatida conjuntamente. "Los trágicos sucesos ocurridos recientemente en #Crocus han demostrado una vez más la necesidad de intensificar los esfuerzos conjuntos de los especialistas en estos campos y de los legisladores para contrarrestar este mal universal.
#Rusia#CrocusCityHall
📣 Por si te lo perdiste, aquí están los puntos clave de la rueda de prensa de la portavoz de la Cancillería de Rusia, María Zajárova(25 de marzo de 2026)
🔹Crisis ucraniana
🔹Aniversario de la masacre de Jatín
🔹Aniversario del ataque terrorista en Crocus City Hall
🔹Presentación del informe “Doctores Mengele del régimen de Kiev”
🔹Situación en Oriente Medio
🔹 Golpes contra sitios culturales e históricos en Irán
🔹 Marcha de Waffen-SS en Riga
🔹 Letonia prohíbe la entrada a los músicos que actuaron en Rusia y Bielorrusia
🔹 El 35º Aniversario de las relaciones diplomáticas entre Rusia y Panamá
📰Leer
📺Ver
#MártiresPorLaVerdad
⚡️La Unión Rusa de Periodistas ha publicado el informe "Inconsistencias en el registro público de periodistas asesinados en 2025: un análisis comparativo de los materiales del CPJ, la UNESCO y la FIP".
📄INFORME COMPLETO (en inglés): ( PDF | Telegraph )
#CrímenesDelRégimenDeKiev
• El régimen de Kiev elige como objetivos a los más vulnerables de la población civil. La semana pasada, como víctimas del terror de FF.AA. ucranianas alentado por Occidente, fueron afectadas ❗️más de 133 personas, incluso 10 niños. 14 personas fallecieron.
#ProhibidoOlvidar
• El 22 de marzo se conmemora el trágico acontecimiento de nuestra historia: la destrucción en 1943 de la aldea bielorrusa de Jatín junto con todos sus habitantes. Aquel día fallecieron 149 personas, 75 de ellas eran niños.
• La tragedia de Jatín no es el único episodio de la guerra, sino uno de los miles de hechos que muestran la política deliberada de genocidio de la Alemania nazi contra el pueblo soviético multinacional.
• El 22 de marzo no es solo #Jatín; el 22 de marzo de 2024 es la tragedia en nuestro país ya en el periodo contemporáneo. Como resultado del atentado terrorista [en el complejo #CrocusCityHall] fallecieron… no quisiera establecer paralelos, 149 personas. En Jatín, el 22 de marzo, fallecieron 149 personas.
• Según los resultados de la investigación, el crimen en Crocus City Hall fue planeado y cometido en interés de la actual jefatura de Ucrania con el fin de desestabilizar la situación política en nuestro país.
#OrienteMedio#Irán
• Nuestra postura principal no tiene cambios. Partimos de que las conversaciones son la única vía razonable para salir de la gravísima crisis en la cual el tándem estadounidense-israelí ha sumido a la región de Oriente Medio y, en esencia, al mundo entero.
• Debido a los ataques de EE.UU. e Israel contra Irán, fueron dañados unos sitios culturales incluidos en la Lista del Patrimonio Mundial de la UNESCO. Existe el peligro de que sean destruidos los monumentos más antiguos. Nuestro deber es preservarlos para las generaciones futuras.
#BRICS
• Apoyamos las prioridades de trabajo del BRICS anunciadas por nuestros amigos de India para el año en curso. Estamos seguros de que, con esfuerzos conjuntos, lograremos llegar a la XVIII Cumbre del BRICS, que tendrá lugar en septiembre de 2026, con logros tangibles. Confiamos en el trabajo continuo en las iniciativas de Rusia, incluso la creación de la infraestructura transfronteriza de pagos, compensación y depósito, así como un mecanismo de sistema de seguros y reaseguros, la Bolsa de Cereales del BRICS y una nueva plataforma de inversiones.
#RusiaVietnam
• Fue firmado el Acuerdo para la construcción de una central nuclear en Vietnam con el apoyo de Rosatom, el líder mundial en solicitudes de la construcción de plantas de energía nuclear. En 11 países se están construyendo o ya se han construido 41 unidades de energía.
#TeatroBolshói
• El principal teatro de Rusia, el Teatro Bolshói, celebra su 250° Aniversario. Combinando tradiciones y nuevas tendencias, el Teatro Bolshói representa el arte ruso en las principales escenas internacionales, manteniéndose como un centro de la cultura mundial.