Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#Concierto5#Emperador#Beethoven#MaurizioPollini#DanielePollini
Título:Concierto para piano y orquesta nº 5, en mi bemol mayor, op. 73, "Emperador"
Autor:Ludwig van Beethoven
Movimientos:
🎵 00:35 I. Allegro
🎵 21:00 II. Adagio un poco mosso
🎵 28:53 III. Allegro ma non troppo
Interpretación:
Orquesta Sinfónica de Galicia
Maurizio Pollini - Piano
Director:Daniele Pollini
Fuente:🎼
@ClasicaAlAtardecer
#Concierto5#Emperador#Beethoven#MaurizioPollini#DanielePollini
EL CONCIERTO PARA PIANO N.º 5 EN MI BEMOL MAYOR, OP. 73
El concierto para piano n.º 5 en mi bemol mayor, op. 73, conocido popularmente como «Emperador», fue el último concierto para piano del compositor Ludwig van Beethoven. Fue escrito entre 1809 y 1811 en Viena y está dedicado a Rodolfo de Austria, protector y pupilo de Beethoven. En 1812 Carl Czerny, alumno del compositor, estrenó la obra en Viena. El sobrenombre de «Emperador» no fue asignado por el propio Beethoven sino por Johann Baptist Cramer, el editor inglés del concierto.
El Emperador está dividido en los tres movimientos tradicionales de los conciertos:
🎵I. Allegro
🎵 II. Adagio un poco mosso
🎵 III. Rondo - Allegro ma non troppo
El primer movimiento se abre con un grandioso acorde de MI bemol para toda la orquesta, interrumpido por una serie de arpegios igualmente imponentes para el solo, sugiriendo una cadencia temprana. Pero en lugar de ello, Beethoven alterna pronunciamientos poderosos para la orquesta y el piano. La introducción terminó, el piano ofrece un tema amplio y arrogante del cual (y del subsiguiente, más tenue, segundo tema) Donald Francis Tovey escribió: "La orquesta no sólo es sinfónica, sino que está capacitada por la necesidad misma de acompañar ligeramente al solo para producir efectos orquestales etéreos queestán en una categoría bastante diferente de cualquier cosa en las sinfonías. Por otra parte, la parte solista desarrolla la técnica de su instrumento con una libertad y brillantez para la que Beethoven no tiene ocio en las sonatas y la música de cámara".
El segundo movimiento es una de las inspiraciones sublimes del compositor. Las cuerdas silenciadas tocan un tema de incomparable belleza y triste ternura, la piano respuesta en trillizos silenciosos y descendentes, creando una sutil tensión hasta que el tema queda totalmente expuesto. El carácter nocturno del movimiento se ve favorecido por un delicado equilibrio de suaves vientos de madera, cuerdas y el solo, a medida que la música se desvanece misteriosamente. Luego, sobre una nota de trompeta sostenida, el piano introduce, suave y tranquilo andante, el tema del rondó final. De repente, dramáticamente, el tema final piano se precipita, un grandioso y exuberante allegro.
El tercer movimiento sigue ininterrumpidamente al segundo y es un típico rondó italiano, de la forma (ABACABA). El tema principal es interpretado por el piano y luego respondido por la orquesta. Escalas en el piano introducen el segundo tema, que también es respondido por la orquesta. En la sección C, mucho más larga, se presenta el tema A en tres tonalidades diferentes.
En ella, Beethoven nos enseña el tema principal en tres tonalidades diferentes, demostración inequívoca de su pericia en el arte de la modulación y el juego formal. De igual modo, mención especial cabríahacer del final del concierto, donde un solitario dúo entre el solista y el timbal parece generar un diálogo a punto de detenerseen una mansa quietud que será rápidamente desquebrajada por el piano, cuyo explosivo final contagiará de su brioso ímpetu a toda la orquesta
Así pues, podemos afirmar sin miedo a caer en ninguna ponderación desmesurada que el concierto “Emperador” de Beethoven es mucho más que una obra icónica en el repertorio para piano y orquesta. Su quinto concierto no solo abre la puerta hacia el concierto romántico, sino que la traspasa. La nobleza de sus exhalaciones y el sentido triunfal de las mismas hacen que esta partitura siga deslumbrando doscientos años después de ser concebida. Un sentido triunfal que, paradójicamente, en su vida apenas hallamos; quizá por este motivo, Beethoven nos legó este concierto como el mejor de los consuelos para las derrotas de nuestra propia condición humana.
@ClasicaAlAtardecer
#Concierto5#Emperador#Beethoven#MaurizioPollini#DanielePollini
Título:Concierto para piano y orquesta nº 5, en mi bemol mayor, op. 73, "Emperador"
Autor:Ludwig van Beethoven
Movimientos:
🎵 00:35 I. Allegro
🎵 21:00 II. Adagio un poco mosso
🎵 28:53 III. Allegro ma non troppo
Interpretación:
Orquesta Sinfónica de Galicia
Maurizio Pollini - Piano
Director:Daniele Pollini
Fuente:🎼
@ClasicaAlAtardecer
#Concierto5#Emperador#Beethoven#MaurizioPollini#DanielePollini
EL CONCIERTO PARA PIANO N.º 5 EN MI BEMOL MAYOR, OP. 73
El concierto para piano n.º 5 en mi bemol mayor, op. 73, conocido popularmente como «Emperador», fue el último concierto para piano del compositor Ludwig van Beethoven. Fue escrito entre 1809 y 1811 en Viena y está dedicado a Rodolfo de Austria, protector y pupilo de Beethoven. En 1812 Carl Czerny, alumno del compositor, estrenó la obra en Viena. El sobrenombre de «Emperador» no fue asignado por el propio Beethoven sino por Johann Baptist Cramer, el editor inglés del concierto.
El Emperador está dividido en los tres movimientos tradicionales de los conciertos:
🎵I. Allegro
🎵 II. Adagio un poco mosso
🎵 III. Rondo - Allegro ma non troppo
El primer movimiento se abre con un grandioso acorde de MI bemol para toda la orquesta, interrumpido por una serie de arpegios igualmente imponentes para el solo, sugiriendo una cadencia temprana. Pero en lugar de ello, Beethoven alterna pronunciamientos poderosos para la orquesta y el piano. La introducción terminó, el piano ofrece un tema amplio y arrogante del cual (y del subsiguiente, más tenue, segundo tema) Donald Francis Tovey escribió: "La orquesta no sólo es sinfónica, sino que está capacitada por la necesidad misma de acompañar ligeramente al solo para producir efectos orquestales etéreos queestán en una categoría bastante diferente de cualquier cosa en las sinfonías. Por otra parte, la parte solista desarrolla la técnica de su instrumento con una libertad y brillantez para la que Beethoven no tiene ocio en las sonatas y la música de cámara".
El segundo movimiento es una de las inspiraciones sublimes del compositor. Las cuerdas silenciadas tocan un tema de incomparable belleza y triste ternura, la piano respuesta en trillizos silenciosos y descendentes, creando una sutil tensión hasta que el tema queda totalmente expuesto. El carácter nocturno del movimiento se ve favorecido por un delicado equilibrio de suaves vientos de madera, cuerdas y el solo, a medida que la música se desvanece misteriosamente. Luego, sobre una nota de trompeta sostenida, el piano introduce, suave y tranquilo andante, el tema del rondó final. De repente, dramáticamente, el tema final piano se precipita, un grandioso y exuberante allegro.
El tercer movimiento sigue ininterrumpidamente al segundo y es un típico rondó italiano, de la forma (ABACABA). El tema principal es interpretado por el piano y luego respondido por la orquesta. Escalas en el piano introducen el segundo tema, que también es respondido por la orquesta. En la sección C, mucho más larga, se presenta el tema A en tres tonalidades diferentes.
En ella, Beethoven nos enseña el tema principal en tres tonalidades diferentes, demostración inequívoca de su pericia en el arte de la modulación y el juego formal. De igual modo, mención especial cabríahacer del final del concierto, donde un solitario dúo entre el solista y el timbal parece generar un diálogo a punto de detenerseen una mansa quietud que será rápidamente desquebrajada por el piano, cuyo explosivo final contagiará de su brioso ímpetu a toda la orquesta
Así pues, podemos afirmar sin miedo a caer en ninguna ponderación desmesurada que el concierto “Emperador” de Beethoven es mucho más que una obra icónica en el repertorio para piano y orquesta. Su quinto concierto no solo abre la puerta hacia el concierto romántico, sino que la traspasa. La nobleza de sus exhalaciones y el sentido triunfal de las mismas hacen que esta partitura siga deslumbrando doscientos años después de ser concebida. Un sentido triunfal que, paradójicamente, en su vida apenas hallamos; quizá por este motivo, Beethoven nos legó este concierto como el mejor de los consuelos para las derrotas de nuestra propia condición humana.
@ClasicaAlAtardecer