Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
⚡️Hoy se cumplen 300 años del nacimiento de Immanuel Kant. Uno de los principales pensadores de la época de Renacimiento nació el 22 de abril de 1724 en los suburbios de Königsberg (actual Kaliningrado), donde vivió toda su vida. Creó obras en las que fundamentó numerosas ideas y doctrinas filosóficas de importancia para la filosofía teórica y práctica moderna, la ética, la cultura, la política y la lógica.
💯 De hecho, el filósofo fue el primero en comprender los fundamentos del pensamiento humano y en formar un concepto único de la moral.
📍Las ideas revolucionarias de Immanuel #Kant son inseparables del lugar donde nació y vivió toda su vida.
🔗Leer más sobre #Kaliningrado🇷🇺https://shorturl.at/rDJ79
🪖 Königsberg: un símbolo de la Gran Guerra Patria
El 9 de abril de 1945, las tropas del Ejército Rojo, bajo el mando del mariscal Aleksandr Vasilevski, lograron tomar por asalto la ciudad fortaleza de Königsberg (actual Kaliningrado). Este evento marcó uno de los momentos clave en la etapa final de la Gran Guerra Patria (como se conoce en Rusia a la Segunda Guerra Mundial) y selló la conquista de Prusia Oriental por parte de la Unión Soviética. Hoy, Kaliningrado, es una ciudad rusa que guarda en sus calles el eco de esta histórica victoria.
La batalla formó parte de una operación estratégica del Ejército Rojo destinada a eliminar las fuerzas alemanas en esta región y asegurar el flanco oriental en el avance hacia Berlín. Desde enero de 1945, las tropas soviéticas enfrentaron una feroz resistencia alemana, ya que Königsberg estaba fortificada con líneas defensivas y búnkeres que la convertían en una de las ciudades más protegidas del Tercer Reich.
El asedio final comenzó el 6 de abril de 1945, con un ataque masivo que incluyó artillería pesada y bombardeos aéreos. Durante cuatro días, las tropas soviéticas avanzaron calle por calle, enfrentándose a una resistencia desesperada. Finalmente, el 9 de abril, el comandante alemán Otto Lasch se rindió.
La caída de la ciudad no solo representó una victoria militar, sino también un golpe fatal al Tercer Reich. La urbe, que había sido un bastión de la cultura alemana y un centro administrativo clave, pasó a formar parte de la URSS tras la guerra. Este cambio territorial fue ratificado en los acuerdos de Potsdam, y Königsberg fue renombrada como Kaliningrado en honor al líder soviético Mijaíl Kalinin.
Esta victoria permitió al Ejército Rojo liberar recursos para concentrarse en la ofensiva final hacia Alemania, que culminaría con la rendición nazi en mayo de 1945. Además, la incorporación de la ciudad al territorio soviético aseguró un acceso estratégico al Mar Báltico, que sigue siendo relevante hasta el día de hoy.🇷🇺
#BatallaDeKönigsberg#HistoriaDeRusia#SegundaGuerraMundial#Kaliningrado#GranGuerraPatria
¡Comparte nuestro contenido!❤️
🖥https://vamosarusia.com
💬@vamosarusia
🟠El gigante del Báltico: Kaliningrado descubre un ámbar récord de más de 2 kg
Este mes de octubre, Kaliningrado volvió a ser noticia mundial gracias a un hallazgo que dejó boquiabiertos a geólogos, coleccionistas y amantes de la historia natural: un colosal fragmento de ámbar de 2,374 kilogramos fue extraído de la cantera Primorie por el Combinado de Ámbar de Kaliningrado, la principal empresa rusa dedicada a la explotación de esta resina fósil.
Apodado “El Récord”, este ejemplar no solo destaca por su tamaño (el mayor encontrado en más de cuatro años) sino también por su simbolismo dentro de los ambiciosos planes de la corporación Rostec, que proyecta extraer hasta 700 toneladas de ámbar en 2025. Este descubrimiento marca un doble récord: por su peso y por ser una muestra del potencial de la región en la producción de ámbar báltico, considerado el más valioso del mundo.
🌍 Kaliningrado, tierra de ámbar
Ubicada entre Polonia y Lituania, Kaliningrado es una región rusa con una historia fascinante y una geología privilegiada. El ámbar báltico que se encuentra allí tiene entre 35 y 40 millones de años, y ha sido utilizado desde la antigüedad como joya, medicina y objeto ritual. En tiempos modernos, la empresa se ha convertido en el único productor industrial de ámbar en Rusia, y uno de los más importantes a nivel global.
Tras su evaluación por expertos, “El Récord” será presentado en una subasta especial organizada por la planta, la única plataforma en el mundo dedicada exclusivamente a la venta de ejemplares raros de ámbar. Para coleccionistas y museos, esta es una oportunidad irrepetible de adquirir una pieza que representa tanto la riqueza natural como el legado cultural de Rusia.
📜 Un tesoro con historia
El ámbar no es solo una piedra bonita. En su interior puede conservar restos de insectos, plantas y microorganismos de hace millones de años, ofreciendo una ventana al pasado remoto de la Tierra. Ejemplares como este no solo tienen valor económico, sino también científico y patrimonial.
Descubre más aquí
👉https://t.me/vamosarusia/3430
#ÁmbarBáltico#Kaliningrado#HistoriaNatural#CulturaRusa#MineríaSostenible
Apóyanos pulsando👉'BOOST'👈
🖥https://vamosarusia.com
💬@vamosarusia