Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#Gloria#Vivaldi#HidemiSuzuki
Titulo:Gloria RV 589
Autor:Antonio Vivaldi
Movimientos:
🎵I. Gloria en excelsis Deo
🎵II. Et en terra pax
🎵III. Laudamus te
🎵IV. Gratias agimus tibi
🎵V. Propter magnam gloriam
🎵VI. Domine Deus
🎵VII. Domine, Fili unigenite
🎵VIII. Domine Deus, Agnus Dei
🎵IX. Qui tollis peccata mundi
🎵X. Qui sedes ad dexteram Patris
🎵XI. Quoniam tu solus sanctus
🎵XII. Cum Sancto Spiritu
Interpretación:
Conjunto barroco croata y solistas de la Orquesta Libera Classica (Japón)
El Coro Ángelus
Midori Suzuki - Soprano
Netsuko Someya - Soprano
Sumihito Uesugi - Contratenor
Director:
Hidemi Suzuki
Fuente:🎼
@ClasicaAlAtardecer
#Gloria#Vivaldi#HidemiSuzuki
GLORIA RV 589
Antonio Vivaldi compuso varios Gloria, un tipo de obra religiosa. La que está catalogada como de RV 589 es la más conocida y popular de la música sacra de Vivaldi, pero se sabe que al menos escribió dos Glorias más. Además de la mencionada RV 589, ha llegado a nosotros la RV 588 y hay otra que se ha perdido (RV 590), que sólo se menciona en el catálogo Kreuzherren. El RV 589 fue compuesto hacia 1713 y el RV 588 hacia 1717.
El repertorio coral de Vivaldi fue descubierto a principios del siglo XX. _A_ Alfredo Casella se le atribuye el estreno del Gloria RV 589, en 1939, tras más de 200 años (1713), desde que fuera escrito.
El Gloria RV 589, en re mayor, tiene una duración aproximada de un poco más de media hora y se compone de once o doce movimientos (dependiendo de si el cuarto y el quinto son contados como uno o son contados como un pasaje solamente).
🎵I. Gloria en excelsis Deo (Coro) Gloria, gloria, a Dios en lo más alto.
🎵II. Et en terra pax (Coro) y en la tierra paz y buena voluntad a los hombres.
🎵III. Laudamus te (Sopranos) Te alabamos, te bendecimos. Te adoramos, te glorificamos.
🎵IV. Gratias agimus tibi (Coro) Te damos gracias.
🎵V. Propter magnam gloriam (Coro) por tu gran gloria.
🎵VI. Domine Deus (Soprano) Señor Dios, Rey del cielo, Dios Padre Todopoderoso.
🎵VII. Domine, Fili unigenite (Coro) Señor, el hijo unigénito, Jesucristo.
🎵VIII. Domine Deus, Agnus Dei (Contralto) y coro Señor Dios, Cordero de Dios, Hijo del Padre. Quien quita los pecados del mundo Ten piedad de nosotros.
🎵IX. Qui tollis peccata mundi (Coro) que quita los pecados del mundo Recibe nuestra súplica.
🎵X. Qui sedes ad dexteram Patris (Contralto) Quien está sentado a la diestra del Padre, ten piedad de nosotros.
🎵XI. Quoniam tu solus sanctus (Coro) Porque solo tú eres santo, solo Tú eres el Señor, solo tú eres el más elevado Jesucristo.
🎵XII. Cum Sancto Spiritu (Coro) Con el Espíritu Santo, En la gloria de Dios el Padre, Amén.
Al componer, Vivaldi fragmentó el texto oratorio del Gloria en 11 secciones, cada una de las cuales tiene un ambiente musical propio, por lo cual, si se quiere, puede interpretarse aisladamente una sola pieza.
Todas las partes vocales, desde los dos solistas de soprano y alto hasta el tenor y el bajo, fueron escritos originalmente para voces de mujeres, ya que no se permitía a hombres en el Pio Ospedale della Pietà, exclusivamente femenino (Vivaldi y el resto del personal masculino eran , por supuesto, miembros del sacerdocio); de vez en cuando la parte del bajo se mueve tan bajo que incluso los bajos femeninos notables de la Pietà deben haber tenido que transponer una octava. Solo dos instrumentos de viento -un oboe y una trompeta- se agregan al habitual contingente barroco de cuerdas, y el bajo continuo probablemente se habría reproducido por órgano.
@ClasicaAlAtardecer