Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Tapswap All Codes 23 Jan🗓️
1️⃣ - Top Brands in 2025
✅ - afdf
2️⃣ - Earn Free Bitcoin
✅ - a7a2
3️⃣ - Make Your Dreams a Reality
✅ - tenp
4️⃣ - Instagram Into a $100/Day
✅ - exxr
5️⃣ - 5,000$ in 30 Days
✅ - aact
6️⃣ - Unlock Free Products
✅ - fifa
7️⃣ - Online Business in 2025
✅ - rmap
8️⃣ - Want to Achieve It All
✅ - qxun
#tapswap#tapswapcode#tapswapcodes
Tapswap All Codes 21 Jan🗓️
1️⃣ - Earn $100 Every Day
✅ - ouns
2️⃣ - Turn X Into a $5,000/Month
✅ - astv
3️⃣ - Opening an Online Business
✅ - rzr2
4️⃣ - Make Money on Binance
✅ - ema9
5️⃣ - Make 2025 Your Year
✅ - d5n5
6️⃣ - Free Gifts from Loyalty Programs
✅ - v2q3
7️⃣ - Making Money with Free Online
✅ - occl
8️⃣ - You Desire in Life
✅ - cdae
#tapswap#tapswapcode#tapswapcodes
TapSwap Video Codes 🎥
25 December 2024 🗓️
1. Walk Away from Your 9-to-5 Job - kzgs
2. Master the Art of Business Planning - itgi
3. TikTok Shop Dropshipping - ahue
4. Productivity Hacks - mfpi
5. Financial Traps - hmsy
6. Save Money - r4iw
7. Business Ideas - 7sg9
8. Save Time and Money - k77e
9. Google Search - es8m
https://t.me/tapswap_mirror_1_bot?start=r_452308012
#TapSwap#tapswapcodes#tapswapdailycodes
✅Value Airdrop Center Family Daily Combo Answers Are Written Below According to Photo Order, Please do it by proceeding.👇18/02/2025
📢 MemesLab Bums Tapcoins Donot StarsFi Dropee Pocketrocket DrftParty GreenGold Beeharvest Piggybank Flies
You can find more Airdrops from the link.
👉https://t.me/CentralChanel/12301
#DailyCombo#Seed#TGE#Airdrop#Ton#Code#Quiz#Daily#Youtube#Blum#TapswapCodes#MemeFi#Telegram@Airdroptrex