Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🥊Boxeo
La Asociación de Boxeo ataca a Imane Khelif tras salir a la luz su informe médico: "Le ha quitado la medalla de oro a otra finalista"#Boxeo
El triunfo de la argelina Imane Khelif en los Juegos de París 2024 sigue dando de qué hablar. Cuestionado su género durante toda la aventura olímpica, la boxeadora se enfrenta ahora a la existencia de un presunto informe médico que asegura que tiene características biológicas masculinas, entre ellas ausencia de útero y presencia de testículos internos, así como cariotipo XY.
El nuevo episodio de esta polémica ha hecho que se pronuncie Chris Roberts, director ejecutivo de la Asociación Internacional de Boxeo (IBA), que siempre se ha mostrado en contra de la participación en competiciones de Imane Khelif y la taiwanesa Lin Yu-ting, también cuestionada y ganadora de un oro en París.
"Realizamos una prueba cromosómica para comprobar si eran XX o XY, y estos dos boxeadores no cumplían con los criterios de elegibilidad, porque ambos entraban en la categoría XY", afirmó Roberts en The Telegraph, refiriéndose así a su procedimiento para no aceptarlas en el Campeonato del Mundo de 2023, del que fueron apartadas.
"En mi opinión, Thomas Bach (presidente del COI) les ha quitado dos medallas de oro a las otras dos finalistas. ¿Cómo se puede competir siendo mujer en base a un pasaporte? Usted o yo podríamos cambiar nuestros pasaportes para hacerlo. Estas dos boxeadoras terminaron ganando medallas de oro en ambas categorías", sentenció.
https://www.20minutos.es/deportes/noticia/5653712/0/asociacion-boxeo-imane-khelif-informe-medico-quitado-medalla-oro/
🏆@Info288_deportes
🥊Boxeo
La boxeadora argelina Imane Khelif culpa a Elon Musk del ciberacoso que recibió durante los Juegos Olímpicos: «Mi madre iba al hospital todos los días»#Boxeo
La campeona olímpica argelina, Imane Khelif, ha tenido casi un mes para saborear su triunfo fuera del cuadrilátero. Este lunes ha concedido un entrevista al programa Clique de Canal+ en Francia donde ha transmitido el sufrimiento que pasó durante los Juegos Olímpicos por la campaña de ciberacaso, propiciada según cuenta, por Elon Musk, a quien denuncia como una de las primeras personas que difundió el rumor de que se trataba de un «hombre».
«Me odias, pero ni siquiera me conoces, ¿qué te he hecho yo? ni siquiera sé por qué lideraste esta campaña contra mí», dice la boxeadora sobre el magnate. «Fuiste injusto conmigo y con mi familia, con mi madre, durante ese tiempo, mi madre iba al hospital todos los días», lamenta con lágrimas en sus ojos en un vídeo publicado por las redes sociales del programa Clique.
El programa sacó a relucir un tuit de Musk en el que replicaba una publicación donde se decía que los «hombres no tienen nada que hacer en los deportes femeninos» con una imagen de la primera rival de Imane, la italiana Angela Carini, a lo que él respondió que «absolutamente». La boxeadora trasalpina tuvo que abandonar el primer combate porque no podía luchar contra la argelina, un gesto que más tarde levantó la polémica por el hiperandrogenismo de Imane.
https://www.abc.es/deportes/juegos-olimpicos/boxeadora-argelina-imane-khelif-culpa-elon-musk-20240909125533-nt.html
🏆@Info288_deportes
Género:
#CienciaFicción |#Acción|#Deporte|#Boxeo|#Robots
Sinopsis:
Gigantes de Acero (2011)
En un futuro no muy lejano el boxeo es robótico: en los combates ya no se enfrentan seres humanos, sino robots humanoides, sofisticadas máquinas diseñadas para luchar. Charlie Kenton, un antiguo púgil que casi llegó a alcanzar la gloria, está pasando una mala racha como promotor de combates. Un día, encuentra un viejo robot desechado y, al comprobar que es un gran boxeador, decide entrenarlo.
¡¡MIRALA POR TERABOX!
https://teraboxapp.com/s/1tWavZIxC6uKbusD_gR3h5w