Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
📩#ENAUSDT 1h | Mid-Term
📉Long Entry Zone: 0.3388-0.3188
🎯 - Strategy Accuracy: 93.16%
Last 5 signals: 100.0%
Last 10 signals: 91.67%
Last 20 signals: 95.45%
⏳ - Signal details:
Target 1: 0.3439
Target 2: 0.3490
Target 3: 0.3540
Target 4: 0.3693
_____
🧲Trend-Line: 0.3188
❌Stop-Loss: 0.3140
💡After reaching the first target you can put the rest of the position to breakeven
📩#ENAUSDT 1h | Mid-Term
📉Long Entry Zone: 0.3974-0.3801
🎯 - Strategy Accuracy: 93%
Last 5 signals: 100%
Last 10 signals: 90%
Last 20 signals: 95%
⏳ - Signal details:
Target 1: 0.4034
Target 2: 0.4093
Target 3: 0.4153
Target 4: 0.4332
_____
🧲Trend-Line: 0.3801
❌Stop-Loss: 0.3744
💡After reaching the first target you can put the rest of the position to breakeven
📩#ENAUSDT 1h | Mid-Term
📉Short Entry Zone: 0.1189-0.1242
🎯 - Strategy Accuracy: 94.26%
Last 5 signals: 100.0%
Last 10 signals: 100.0%
Last 20 signals: 100.0%
⏳ - Signal details:
Target 1: 0.1175
Target 2: 0.1160
Target 3: 0.1146
Target 4: 0.1103
_____
🧲Trend-Line: 0.1242
❌Stop-Loss: 0.1257
💡After reaching the first target you can put the rest of the position to breakeven
#ID20000036639
📩#ENAUSDT 1h | Mid-Term
📈Long Entry Zone: 0.1737-0.1678
🎯 - Strategy Accuracy: 94.11%
Last 5 signals: 100.0%
Last 10 signals: 100.0%
Last 20 signals: 100.0%
⏳ - Signal details:
Target 1: 0.1758
Target 2: 0.1779
Target 3: 0.1800
Target 4: 0.1862
_____
🧲Trend-Line: 0.1678
❌Stop-Loss: 0.1658
💡After reaching the first target you can put the rest of the position to breakeven
#ID20000036408
📩#ENAUSDT 1h | Mid-Term
📈Long Entry Zone: 0.2118-0.2024
🎯 - Strategy Accuracy: 83.44%
Last 5 signals: 90.0%
Last 10 signals: 85.0%
Last 20 signals: 77.5%
⏳ - Signal details:
Target 1: 0.2150
Target 2: 0.2182
Target 3: 0.2213
Target 4: 0.2309
_____
🧲Trend-Line: 0.2024
❌Stop-Loss: 0.1994
💡After reaching the first target you can put the rest of the position to breakeven
#ID20000035694
👀 Well, would you look at that! 👆
#ENAUSDT has just reached 9th TP in the VIP CLUB channel!!!👍
With a 5% entry and a $1000 deposit, you could've earned $461!
Every day we're on fire! 🔥🔥🔥ACCESS TO MANUAL TRADING for 70usdt/month
👉 Not sure? Considering? Contemplating? Come have a look at our performance reports, spend about5 minutes and see for yourself that everything is 100% legit! @propheta_reports
Register and get bonuses up to $6,000
Binance | OKX | ByBit👈🏻click!
#AItrader#cryptobot#cryptochannel