Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#Sinfonia45 #Haydn#ConradVanAlphen
La Sinfonía n.º 45 en fa sostenido menor, Hoboken I/45, conocida como Sinfonía de los adioses, es una sinfonía del austríaco Joseph Haydn, compuesta en 1772.
Fue escrita para el patrón de Haydn, el príncipe Nikolaus Esterházy, durante una estancia en la que Haydn y la corte de músicos permanecieron en el palacio de verano, en Eszterháza. La estancia fue más larga de lo esperado y los músicos en su mayoría fueron obligados a mover a sus mujeres en casa, en Eisenstadt, por lo que en el último movimiento de la sinfonía, Haydn instó sutilmente a su patrón a dejarles volver a casa. Durante el adagio final cada músico deja de tocar, apaga la vela de su atril y se va en orden, dejando al final solo dos violines tocados con sordina (tocados por el propio Haydn y el concertino, Alois Luigi Tomasini).
La sinfonía consta de cuatro movimientos:
🎵 Allegro assai, 3/4
🎵 Adagio, 3/8
🎵 Menuet: Allegretto, 3/4
🎵 Finale: Presto, 2/2 - Adagio, 3/8
El primer movimiento de la obra es un episodio turbulento en fa sostenido menor, una tonalidad extremadamente inusual para usar en esa parte de la obra. Comienza a la manera típica del periodo Sturm und Drang de Haydn, con arpegios menores descendentes en los primeros violines junto con notas sincopadas en los segundos violines y acordes mantenidos en los vientos. El movimiento sigue la forma sonata, pero se desvía del modelo común en varias ocasiones. Aparte de estas desviaciones de la norma, el primer movimiento es "bastante difícil de ser percibido como revolucionario" y "no es tan intrépido, al contener un desarrollo que solo se aventura a los niveles de IV, II♭ y VI, además de la mediante y la tónica".
El segundo movimiento, lento en la mayor y en compás de 3/8 también está escrito en forma sonata. Comienza con una relajante melodía tocada por violines con sordina, representando un motivo que "tiene hipo". El ambiente gradualmente se vuelve más sombrío y meditabundo con la alternancia entre modos mayores y menores, asemejándose a pasajes de las últimas obras de Schubert. A continuación siguen una serie de suspensiones disonantes mantenidas durante varios compases, que son extendidas hasta una gran duración por Haydn mientras que el mismo material aparece en la recapitulación. James Webster siente la música como programática, expresando el añoro del hogar.
El siguiente minueto está en la tonalidad de fa sostenido mayor; su principal peculiaridad es que la cadencia final de cada sección está construida de manera que suena muy débil, creando una sensación de incompletitud.
El último movimiento empieza como es característico en Haydn, como un final rápido y en 2/2, escrito en forma sonata y en la tonalidad de la obra: fa sostenido menor. La intensidad rítmica se incrementa mediante el uso de bariolage al unísono en la parte del primer violín. La música finalmente alcanza el final de la recapitulación en un pasaje que suena como si la sinfonía acabara, pero de repente es interrumpida por una cadencia rota.
A continuación sigue una larga coda, como si de un segundo movimiento lento se tratara, que es extremadamente inusual en sinfonías clásicas y probablemente sonaría muy sorprendente para el Príncipe. Está escrito en compás de 3/8 y modula de la mayor a fa sostenido mayor, momento en el que los músicos van abandonando sus puestos. El final es una especie de anticlímax deliberado y se suele interpretar en un suave pianissimo.
Este adagio final incluye una curiosidad que no todo oyente es capaz de percibir al oír una grabación: varios músicos tienen solos pequeños justo antes de marcharse. El orden de salida es: primer oboe y segunda trompa (con solos), fagot (sin solo), segundo oboe y primera trompa (con solos), contrabajos (solo), violonchelos (sin solo), violines orquestales (con solos; músicos de primera silla no tocan), viola (sin solo). Los violines de primera silla se quedan para completar la obra.
@ClasicaAlAtardecer
#Sinfonía45 #Haydn#ConradVanAlphen
La Sinfonía n.º 45 en fa sostenido menor, Hoboken I/45, conocida como Sinfonía de los adioses, es una sinfonía del austríaco Joseph Haydn, compuesta en 1772.
Fue escrita para el patrón de Haydn, el príncipe Nikolaus Esterházy, durante una estancia en la que Haydn y la corte de músicos permanecieron en el palacio de verano, en Eszterháza. La estancia fue más larga de lo esperado y los músicos en su mayoría fueron obligados a mover a sus mujeres en casa, en Eisenstadt, por lo que en el último movimiento de la sinfonía, Haydn instó sutilmente a su patrón a dejarles volver a casa. Durante el adagio final cada músico deja de tocar, apaga la vela de su atril y se va en orden, dejando al final solo dos violines tocados con sordina (tocados por el propio Haydn y el concertino, Alois Luigi Tomasini).
La sinfonía consta de cuatro movimientos:
🎵 Allegro assai, 3/4
🎵 Adagio, 3/8
🎵 Menuet: Allegretto, 3/4
🎵 Finale: Presto, 2/2 - Adagio, 3/8
El primer movimiento de la obra es un episodio turbulento en fa sostenido menor, una tonalidad extremadamente inusual para usar en esa parte de la obra. Comienza a la manera típica del periodo Sturm und Drang de Haydn, con arpegios menores descendentes en los primeros violines junto con notas sincopadas en los segundos violines y acordes mantenidos en los vientos. El movimiento sigue la forma sonata, pero se desvía del modelo común en varias ocasiones. Aparte de estas desviaciones de la norma, el primer movimiento es "bastante difícil de ser percibido como revolucionario" y "no es tan intrépido, al contener un desarrollo que solo se aventura a los niveles de IV, II♭ y VI, además de la mediante y la tónica".
El segundo movimiento, lento en la mayor y en compás de 3/8 también está escrito en forma sonata. Comienza con una relajante melodía tocada por violines con sordina, representando un motivo que "tiene hipo". El ambiente gradualmente se vuelve más sombrío y meditabundo con la alternancia entre modos mayores y menores, asemejándose a pasajes de las últimas obras de Schubert. A continuación siguen una serie de suspensiones disonantes mantenidas durante varios compases, que son extendidas hasta una gran duración por Haydn mientras que el mismo material aparece en la recapitulación. James Webster siente la música como programática, expresando el añoro del hogar.
El siguiente minueto está en la tonalidad de fa sostenido mayor; su principal peculiaridad es que la cadencia final de cada sección está construida de manera que suena muy débil, creando una sensación de incompletitud.
El último movimiento empieza como es característico en Haydn, como un final rápido y en 2/2, escrito en forma sonata y en la tonalidad de la obra: fa sostenido menor. La intensidad rítmica se incrementa mediante el uso de bariolage al unísono en la parte del primer violín. La música finalmente alcanza el final de la recapitulación en un pasaje que suena como si la sinfonía acabara, pero de repente es interrumpida por una cadencia rota.
A continuación sigue una larga coda, como si de un segundo movimiento lento se tratara, que es extremadamente inusual en sinfonías clásicas y probablemente sonaría muy sorprendente para el Príncipe. Está escrito en compás de 3/8 y modula de la mayor a fa sostenido mayor, momento en el que los músicos van abandonando sus puestos. El final es una especie de anticlímax deliberado y se suele interpretar en un suave pianissimo.
Este adagio final incluye una curiosidad que no todo oyente es capaz de percibir al oír una grabación: varios músicos tienen solos pequeños justo antes de marcharse. El orden de salida es: primer oboe y segunda trompa (con solos), fagot (sin solo), segundo oboe y primera trompa (con solos), contrabajos (solo), violonchelos (sin solo), violines orquestales (con solos; músicos de primera silla no tocan), viola (sin solo). Los violines de primera silla se quedan para completar la obra.
@ClasicaAlAtardecer