Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
💢Resultados de las VOTACIONES💢
🌸 Niña 🌸
🥇 Primer lugar: Trabajo 1️⃣ Unicornio 🦄 técnica amigurumi por @Narya_Crochet
🥈 Segundo lugar:
Trabajo 2️⃣ Aretes Mini margaritas de cerámica fría por @biaceramicafria
🥉 Tercer lugar: -
Muchísimas gracias por participar 😊 y muchas felicidades 🥳
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
✨ Los trabajos ganadores se publicarán por el canal con una breve descripción y el @ del autor para promover su obra o emprendimiento. (Durante 1 semana)
‼️Además, el🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram⬅️🆕
🥈 Segundo lugar: Dice el próximo reto.
#retos#informacion#info#reto
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
💢Resultados de las VOTACIONES💢
🎄 Navidad 🎄
🥇Primer lugar: Trabajo 3️⃣ Colección de estatuillas de cerámica fría 🎅☃️, colgantes para tu arbolito 🎄 y diademas temáticas 🦌hechas totalmente a mano por @Anaeli1919
🥈Segundo lugar:
Trabajo 1️⃣ Aretes navideños por @BichiMakerJunior
🥉Tercer lugar: Trabajo 2️⃣ Postales navideñas y mini arbolitos de navidad por @Samy_Robert
Muchísimas gracias por participar 😊 y muchas felicidades 🥳
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
✨ Los trabajos ganadores se publicarán por el canal con una breve descripción y el @ del autor para promover su obra o emprendimiento. (Durante 1 semana)
‼️Además, el🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Dice el próximo reto.
#retos#informacion#info#reto
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
💢Resultados de las VOTACIONES💢
🎃☠️👻 Halloween 👻☠️🎃
🥇 Primer lugar: Trabajo 2️⃣ Witch cat por @Narya_Crochet
🥈 Segundo lugar:
Trabajo 1️⃣ Araña Ágatha por @Narya_Crochet
Trabajo 3️⃣ Aretes de miedo por @BichiMakerJunior
Trabajo 4️⃣ Imanes para decorar la casa en Halloween por @AmorParkSarangStore
Muchísimas gracias por participar 😊 y muchas felicidades 🥳
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
✨ Los trabajos ganadores se publicarán por el canal con una breve descripción y el @ del autor para promover su obra o emprendimiento. (Durante 1 semana)
‼️Además, el🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Dice el próximo reto. Como son 3 deben llegar a un consenso 😅
#retos#informacion#info#reto
🎄✨❄️🎁❤️☃️🌨️🎄✨❄️🎁❤️☃️🌨️
Próximo RETO
🍁☃️🎄 Navidad 🎄☃️🍁
✨ Técnica: libre (manualidad)
✨ Publicación: deben publicar el trabajo por nuestro espacio de intercambio utilizando el marcador 📍#navidad
✨ Deben poner una descripción breve de la obra
❄️ Fecha tope: Domingo 13 de noviembre
❄️ Horario de publicación: hasta las 7:59 pm
❄️ Horario de votaciones: 8:00 pm
❄️ Cierre de las votaciones: Al otro día
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
☃️ Los 3 trabajos ganadores se publicarán por el canal con una breve descripción y datos del autor para promover su obra o emprendimiento.
Además, el
🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Gana unos aretes de Bia cerámica fría
🥉 Tercer lugar: Dice el próximo reto.
🎄✨❄️🎁❤️☃️🌨️🎄✨❄️🎁❤️☃️🌨️
#retos#informacion#info#reto
⭐☃️❄️🌲⭐☃️❄️🌲⭐☃️❄️🌲⭐☃️❄️🌲
Nuestras ganadoras nos anuncian que el Próximo reto será:
☃️⭐NAVIDAD🌲❄️
✨ Técnica: libre (manualidad)
✨ Publicación: deben publicar el trabajo por nuestro espacio de intercambio utilizando el marcador 📍#navidad
✨ Deben poner una descripción breve de la obra
✨ Fecha de publicación: Domingo 2️⃣8️⃣ de noviembre
✨ Horario de publicación: hasta las 7:59 pm
✨ Horario de votaciones: 8:00 pm
✨ Cierre de las votaciones: Al otro día
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
✨ Los 3 trabajos ganadores se publicarán por el canal con una breve descripción y datos del autor para promover su obra o emprendimiento. (Durante 1 semana)
Además, el
🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Dice el próximo reto.
#retos#informacion#info#reto
🦸👻🎃💥✨👺👹😈🤡🤠☠️💐🌛👽🤖🧟
Próximo RETO
🍁🎃☠️ Halloween ☠️🎃🍁
✨ Técnica: libre (manualidad)
✨ Publicación: deben publicar el trabajo por nuestro espacio de intercambio utilizando el marcador 📍#halloween
✨ Deben poner una descripción breve de la obra
❄️ Fecha tope: Domingo 30 de octubre
❄️ Horario de publicación: hasta las 7:59 pm
❄️ Horario de votaciones: 8:00 pm
❄️ Cierre de las votaciones: Al otro día
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
☃️ Los 3 trabajos ganadores se publicarán por el canal con una breve descripción y datos del autor para promover su obra o emprendimiento.
Además, el
🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Gana unos aretes de Bia cerámica fría
🥉 Tercer lugar: Dice el próximo reto.
🦸👻🎃💥✨👺👹😈🤡🤠☠️💐🌛👽🤖🧟
#retos#informacion#info#reto
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
💢Resultados de las VOTACIONES💢
🍁 Otoño 🍁
🥇 Primer lugar: Trabajo 1️⃣ Diseños de accesorios y atrapasueños inspirados en los colores de las hojas del #otoño , las plumas son de cernícalo (ojo tomadas en la muda, no dañamos animales) que casualmente tiene su etapa migratoria en esta estación; por @Chanyela
🥈 Segundo lugar:
Trabajo 2️⃣ Aretes de cerámica fría por @biaceramicafria
🥉 Tercer lugar: -
Muchísimas gracias por participar 😊 y muchas felicidades 🥳
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
✨ Los trabajos ganadores se publicarán por el canal con una breve descripción y el @ del autor para promover su obra o emprendimiento. (Durante 1 semana)
‼️Además, el🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Dice el próximo reto.
#retos#informacion#info#reto
✨🍁🍂❄️🌾🍄🌻🌨️🌘☔🌲🌿🍃🍀🪴🌵
Próximo RETO
🍁🍂❄️OTOÑO❄️🍂🍁
✨ Técnica: libre (manualidad)
✨ Publicación: deben publicar el trabajo por nuestro espacio de intercambio utilizando el marcador 📍#otoño
✨ Deben poner una descripción breve de la obra
❄️ Fecha tope: Domingo 16 de octubre
❄️ Horario de publicación: hasta las 7:59 pm
❄️ Horario de votaciones: 8:00 pm
❄️ Cierre de las votaciones: Al otro día
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
☃️ Los 3 trabajos ganadores se publicarán por el canal con una breve descripción y datos del autor para promover su obra o emprendimiento.
Además, el
🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Gana unos aretes de Bia cerámica fría
🥉 Tercer lugar: Dice el próximo reto.
✨🍁🍂❄️🌾🍄🌻🌨️🌘☔🌲🌿🍃🍀🪴🌵
#retos#informacion#info#reto
✨🍄☃️🙌🙋🏻♀️🎉🕺🥳🌸💪🌻❤️🍀👍✨
Se reanudan los RETOS
🥰 Temática Libre 🥰
11 de Octubre: Día Internacional de la Niña
✨ Técnica: libre (manualidad)
✨ Publicación: deben publicar el trabajo por nuestro grupo utilizando el marcador 📍#niña
✨ Deben poner una descripción breve de la obra
❄️ Fecha tope: Domingo 9 de octubre
❄️ Horario de publicación: hasta las 7:59 pm
❄️ Horario de votaciones: 8:00 pm
❄️ Cierre de las votaciones: Al otro día
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
☃️ Los 3 trabajos ganadores se publicarán por el canal con una breve descripción y datos del autor para promover su obra o emprendimiento.
Además, el
🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram y compartimos el enlace a su catálogo en el canal ⬅️🆕
🥈 Segundo lugar: Dice el próximo reto.
✨🍄☃️🙌🙋🏻♀️🎉🕺🥳🌸💪🌻❤️🍀👍✨
#retos#informacion#info#reto
🥰💘💓💔🍀😍❤️💞💟💌❣️💝💖💋🫀
Próximo RETO
💓💘🥰San Valentín🥰💘💓
14 de febrero
día del 🅰🅼🅾🆁 y la 🅰🅼🅸🆂🆃🅰🅳
✨ Técnica: libre (manualidad)
✨ Publicación: deben publicar el trabajo por nuestro espacio de intercambio utilizando el marcador 📍#14febrero
✨ Deben poner una descripción breve de la obra
❄️ Fecha tope: Domingo 13 de febrero
❄️ Horario de publicación: hasta las 7:59 pm
❄️ Horario de votaciones: 8:00 pm
❄️ Cierre de las votaciones: Al otro día
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
☃️ Los 3 trabajos ganadores se publicarán por el canal con una breve descripción y datos del autor para promover su obra o emprendimiento.
Además, el
🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Dice el próximo reto.
🥰💘💓💔🍀😍❤️💞💟💌❣️💝💖💋🫀
#retos#informacion#info#reto
🧙🏻♂️🧝🧚🧝🧙🏻♂️🧚🧝🧙🏻♂️🧚🧝🧙🏻♂️🧚🧝🧙🏻♂️🧚🧝
Nuestra ganadora nos anuncia el tema del próximo reto
🧙🏻♂️🧝🧚DUENDES🧚🧝🧙🏻♂️
✨ Técnica: libre (manualidad)
✨ Publicación: deben publicar el trabajo por nuestro espacio de intercambio utilizando el marcador 📍#duendes
✨ Deben poner una descripción breve de la obra
❄️ Fecha tope: Domingo 26 de diciembre
❄️ Horario de publicación: hasta las 7:59 pm
❄️ Horario de votaciones: 8:00 pm
❄️ Cierre de las votaciones: Al otro día
─━━━━━━⊱✰✰✰✰✰⊰━━━━━━─
🌸 ✿Premios✿ 👇
☃️ Los 3 trabajos ganadores se publicarán por el canal con una breve descripción y datos del autor para promover su obra o emprendimiento.
Además, el
🥇 Primer lugar:
🆕➡️ Gana una Publicación + Etiqueta en nuestra cuenta de Instagram ⬅️🆕
🥈 Segundo lugar: Dice el próximo reto.
🧙🏻♂️🧝🧚🧝🧙🏻♂️🧚🧝🧙🏻♂️🧚🧝🧙🏻♂️🧚🧝🧙🏻♂️🧚🧝
#retos#informacion#info#reto
💥Times Up Party Amarillo
Diviértete en Navidad con este juego de mímica y palabras
✅OFERTA: 14.99€
❌ Antes: 20.99€
💰Ahorras un 29%🔥
Ideal para reuniones familiares o con amigos, promueve risas y complicidad
👉 Haz que tus fiestas sean inolvidables
#juegosdemesa#fiestas#diversion#navidad#mimica#palabrastabu#reto#amigos
🛰️Oferta publicada en Cultura y Ocio