Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Dr. Roberto Morales Ojeda
(@DrRobertoMOjeda) en X
En la sede del Comité Central conmemoramos el Día de la Rebeldía Nacional teniendo como brújula el legado del Comandante en Jefe y la exhortación de @DiazCanelB a trabajar por hacer de cada día un #26deJulio.También entregamos el carnet a nuevos miembros del PCC y la UJC
https://x.com/DrRobertoMOjeda/status/1947718755200733410
Este sábado en el municipio de #Holguín fueron inaguradas varias obras en saludo al Día de la Rebeldía Nacional el próximo #26deJulio, cuando se cumplen 71 años del asalto a los Cuarteles Moncada y Carlos Manuel de Céspedes.
El recorrido contó con la presencia de Osmani Viñals García, primer secretario del Comité Municipal del PCC en Holguín, Rafael Antonio Brown Sutherland, presidente de la Asamblea Municipal del Poder Popular y Yunior Torres Almaguer, intendente municipal.
En el reparto Luz del propio consejo popular fueron remozados los consultorios 11,12,13 y 14 del médico de la familia donde se trabajó en la impermeabilización, cambio de carpintería, pintura, resane de muros, reparación de la red hidráulica sanitaria, con una inversión valorada en los 2.1 millones de pesos.
El reparto Piedra Blanca del consejo popular Vista Alegre fue testigo de la inauguración del consultorio 1 que atiende a una población aproximada de 1200 pacientes. En la obra se ejecutó un presupuesto de 3468.1 millones de pesos donde se cambió la carpintería, hidrosanitaria, la electricidad, pintura y enchapes.
Los habitantes del reparto La Quinta perteneciente a la circunscripción 26 del consejo popular Vista Alegre agradecieron el nuevo taller de servicios técnicos donde se trabajó en el enchape, cambio de carpintería, cubierta y pintura.
En la circunscripción 31 fueron entregadas el mes pasado a madres con tres hijos y otros casos especiales 3 viviendas en la calle 14, obra ejecutada por la constructora DOMUS. El periplo concluyó en el combinado deportivo Jesús Manuel Feliú Leyva donde se reanimó y pintó el gimnasio de pesa y gimnasia rítmica.
✒️ y 📸 John Alex Fernández Leyva
El municipio de #Moa conquistó la sede del acto provincial por el #26deJulio en conmemoración a los asaltos a los cuarteles Moncada y Carlos Manuel de Céspedes, el 26 de julio de 1953.
A 71 años de aquellos sucesos acaecidos en Santiago de Cuba y Bayamo la fecha se conmemora en fraterna emulación entre los diferentes territorios para obtener la sede.
La emulación provincial otorgó la condición de Destacados a los municipios de Rafael Freyre y Gibara, mientras los municipios de Sagua de Tánamo y #Holguín recibieron también el Reconocimiento.
La noticia se conoció en encuentro entre las autoridades y la prensa en el territorio.
Felicidades a los moenses!
📸 tomada de Internet