Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
¿Lunes de cruda? 🤔
🔴#MaruCampos habría usado fotos antiguas para justificar su inasistencia al trabajo este inicio de semana 🙄📸 | ¿Qué opinas? 👇🏻
https://sinlineamx.com/maru-campos-recicla-fotos-para-simular-que-trabaja/
‼️Mientras que con #MaruCampos la fachiza minimiza las contundentes pruebas de sus tratos con EEUU, con Rocha Moya esos mismos fachitos piden cárcel y demás excesos sin una sola prueba concreta 😒
¡Así la doble moral! 🤨
Por: Rodrigo Alcubilla
¡Un abuso! 🤬
🔴#MaruCampos gastó 2 mil 503 millones 798 mil 800 pesos en comunicación social y publicidad, dándoles una buena tajada a medios que operan en la capital del país 📰💰💸
‼️El verdadero escudo de #MaruCampos no está en el Congreso ni en los comunicados, está en el dinero, en miles de millones de pesos en publicidad oficial que han convertido en buena parte en contratos concentrados y en líneas editoriales dóciles.
Porque cuando el presupuesto compra silencio, la rendición de cuentas se vuelve opcional.
Por: Erick Gutiérrez
¡Cuánto cinismo! 🤬
🔴#MaruCampos señaló que "seguirá combatiendo el crimen" por "responsabilidad patriótica" 🙄 | ¿Cómo la ven? 👇🏻
https://sinlineamx.com/maru-campos-justifica-operativo-agentes-cia/
¡Indignante! 🤬
🔴#MaruCampos ha aumentando el gasto en publicidad año con año, pero no hay marketing ni bots que aguanten traición a la patria 🤖❌
https://sinlineamx.com/maru-campos-gasta-2-mil-504-mdp-medios-publicidad/
¡OPOSICIÓN HIPÓCRITA! 🤡
‼️Como fue #MaruCampos, el PAN y la CIA de EEUU no hay problema, pero...
¿Y si hubiera sido Morena con agencias de China o Rusia? 🧐
Por: Crítico Político
¿Ahora se manda sola? 🤬
🔴#MaruCampos ha de pensar que está por encima de las leyes, pero proteger la soberanía es obligación de TODOS 🚨 | ¿Apoyarías un juicio en su contra? 😡👎🏻👇🏻
Así se las gasta el panismo 🤬
🔴#MaruCampos sabía que no asistiría, pero dijo que "sí" para contener las críticas 🙄 ¿Qué opinas de que no dé la cara? 👇🏻
https://sinlineamx.com/maru-campos-rechaza-comparecer-senado-caso-cia/
¡Así de claro! 💥💣
‼️Lo que pasó en Chihuahua no es cosa menor, ni debe tomarse a la ligera.
👉Las mentiras de la Fiscalía y de la gobernadora #MaruCampos ponen en riesgo la seguridad nacional.
"La soberanía nacional y la integridad del territorio chihuahuense no son ningún juego": Andrea Chávez 💥
¡Típico del conservadurismo! 🙄
🔴#Sheinbaum lamentó la postura de la derecha y les recordó que el caso #MaruCampos aún no se aclara 📂☝🏻
https://sinlineamx.com/sheinbaum-critica-oposicion-por-caso-ruben-rocha/
¡Que dé la cara! 😡
🔴 Además del recordatorio, #Sheinbaum señaló que buscó a #MaruCampos para que explique lo sucedido… pero no la encontró 🙄 | ¿Qué opinas? 👇🏻
https://sinlineamx.com/sheinbaum-envia-mensaje-maru-campos-caso-cia/