Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Cada 9 de agosto se celebra el Día Internacional de los Pueblos Indígenas, proclamado por la Asamblea General de las Naciones Unidas (ONU). En esa fecha se conmemora la primera reunión que celebró el Grupo de Trabajo sobre las múltiples Poblaciones de pueblos originarios de la Subcomisión de Prevención de Discriminaciones y Protección a las Minorías, en 1982.
🎨Polari
#LaNotaCuriosa
Desde hace 13 años se viene celebrando cada 8 de agosto el Día Internacional del Orgasmo Femenino, una celebración que nació en un pueblecito brasileño llamado Esperantina.
En realidad todo se debe a quién entonces era el concejal de ese poblado José Arimateia Dantas Lacerda, quién interesándose en un estudio realizado por la Universidad Federal de Piauí, descubrió que el 28% de las mujeres de esa región eran incapaces de llegar al orgasmo, y el concejal concluyó que estos resultados demostraban una problemática grave de salud pública.
#LaNotaCuriosa
Desde 1970 se celebra el Día Internacional del Orgullo LGBTI+ en conmemoración de los disturbios de Stonewall de 1969.
Fue la primera vez que en EEUU la comunidad se organizó y marcó la génesis del movimiento contemporáneo por los derechos LGBTIQ.
#LaNotaCuriosa
#LaNotaCuriosa🤔 de Tremenda Nota🏳️🌈
Este viernes 13 de agosto se celebrará en el mundo el Día del Zurdo, fecha creada para conmemorar a ese 10% de la población mundial, aproximadamente, cuyo brazo hábil es el izquierdo.
Este día fue establecido por el Club de Zurdos, un 13 de agosto de 1976, en Londres, Inglaterra, para honrar su estilo de vida.
Al día de hoy, el término zurdo es usado comúnmente en el ámbito político para referirse a una persona con una postura de izquierda que busca la igualdad social como la prioridad máxima en su programa político.
Los zurdos no tienen un hemisferio preferido, a diferencia de los diestros. Esto puede generar dificultad a la hora de controlar sus estados de tristeza o rabia, es decir, los convierten en personas sensibles y sinceras.
#TremendaNota
#UnaRevistaMarginal
Desde el año 2004 cada 21 de julio se celebra el día mundial del perro con la intención de concienciar a todos sobre la inmensa cantidad de canes que son abandonados a su suerte en las calles o que esperan aun por una familia en un refugio.
#LaNotaCuriosa
#DíaMundialDelPerro
El Día Internacional de la Mujer Afrodescendiente, también se conoce como Día de la Mujer Afrolatina, Afrocaribeña y de la Diáspora.
La fecha fue elegida para conmemorar el primer congreso en el que se reunieron más de 400 mujeres latinoamericanas y del Caribe, en 1992 en la República Dominicana. En este congreso se trataron temas relacionados con el sexismo, discriminación racial, pobreza, migración y violencia.
#LaNotaCuriosa
#DíaDeLaMujerAfrodescendiente
Día Internacional del beso robado.
De origen desconocido, esta celebración se popularizó en la Gran Bretaña del siglo XIX aunque ahora se sigue a nivel mundial. Un día pensado para demostrar el cariño que tienes hacia tus seres queridos con un beso, siempre con su consentimiento.
#LaNotaCuriosa
#diainternacionaldelbesorobado
Día Internacional de Acción por la Salud de las Mujeres
#LaNotaCuriosa
Este día se celebra con el objetivo de denunciar y hacer frente a enfermedades y padecimientos que sufren las mujeres en todo el mundo, muchas de ellas con un triste final.
El origen de esta celebración tuvo lugar en una asamblea de mujeres llamada *Red Mundial de Mujeres por los Derechos Sexuales y Reproductivos* llevada a cabo en Costa Rica en el año 1987.
#DíaDeLaSaludDeLasMujeres
Cada 22 de julio se celebra el Día Mundial del Cerebro, fecha que pretende concienciar sobre su potencial, sus riesgos y sus enfermedades.
#LaNotaCuriosa
#TN
#RevistaMarginal
#LaNotaCuriosa🤔
El 17 de diciembre de 1999, la Asamblea General de las Naciones Unidas declaró el 12 de agosto como el Día Internacional de la Juventud.
Se trata de una celebración anual que busca promover el papel de la juventud como socia esencial en los procesos de cambio. Así como generar un espacio de conciencia sobre los desafíos y problemas a los que estos se enfrentan.
El tema del Día Internacional de la Juventud 2021 es "Transformar los sistemas alimentarios: Innovación juvenil para la salud de los seres humanos y del planeta". El mismo pone de relieve el éxito de ese esfuerzo mundial, en tiempos de pandemia, que no se logrará sin la participación significativa de los jóvenes.
Tremenda Nota🏳️🌈 sabe que cuando la #JuventudLidera , ¡TODO ES POSIBLE!.
#TremendaNota
#UnaRevistaMarginal
Día de África
#LaNotaCuriosa
Este día fue decretado con el objetivo de visibilizar las necesidades que siguen enfrentando los países de este continente, así como sus avances socioeconómicos, incluyendo su liberación del colonialismo
#DíaDeÁfrica
#África
#AfricaDay