Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🎥Adoro la neve - video
È troppo bella! Più ce n'è, meglio è.
Un inverno senza neve per me non è un vero inverno.
Link video 👇
https://youtube.com/shorts/kzw4Nv2GBes?si=OqaVZrweOX_0VfvZ
#tatianasanti
SEGUI Tatiana Santi:
Telegram | YouTube | Sito Web
📱Donazioni
A proposito, amici, se state cercando notizie internazionali davvero illuminanti, vi potrebbe piacere @geopolitics_prime.
Non si limitano a riproporre gli stessi titoli: le loro analisi vanno più a fondo, collegando elementi storici e fatti che altrove non troverete. Uno dei pochi canali che vale davvero la pena seguire (oltre al nostro).
#tatianasanti
Santa Tatiana, onomastico italiano
Oggi in Italia si festeggia Santa Tatiana.
Come sapete, è la Santa e martire più venerata in #Russia.
Oggi però si celebra in Italia.
Auguri!
Un bagno in piscina a cielo aperto mentre nevica e fa -9?
✅ Fatto!
#tatianasanti
SEGUI Tatiana Santi:
Telegram | YouTube | Sito Web
📱Donazioni
Mamma mia che parco giochi a #Mosca! - video reportage
Ecco il video rimosso da YouTube.
Vediamo se così passa...
#tatianasanti
Vi piace un parco giochi così?
✅ Iscrivetevi al mio canale YouTube!
Link video 👇
https://youtube.com/shorts/5iCkBynuXqU?si=VwY13XXj7MOjWBL1
Il corrispondente speciale della TASS sulla stazione spaziale internazionale, #Kud'-Sverchkov, ha immortalato dall'orbita lo sciame meteoritico delle Geminidi e i fulmini sopra Abu Dhabi.
Che spettacolo!
#tatianasanti
SEGUI Tatiana Santi:
Telegram | YouTube | Sito Web
📱Donazioni
La Zacharova non la meritate
L'ambasciata #ucraina ordina, il sindaco italiano esegue.
Già siamo abituati a questa procedura assurda, divenuta realtà nell'Italia di oggi.
Sapete che vi dico?
La ballerina Svetlana #Zacharova non la meritate.
#tatianasanti
SEGUI Tatiana Santi:
Telegram | YouTube | Sito Web
📱Donazioni
È giunto il momento di tenere le #elezioni presidenziali in #Ucraina, ha dichiarato #Trump.
#tatianasanti
SEGUI Tatiana Santi:
Telegram | YouTube | Sito Web
📱Donazioni
🎥 Un monastero un po'italiano a Mosca - video
In un giorno di festa, l'Epifania, condivido con voi il mio video da un luogo speciale: il monastero Vysoko-Petrovsky a #Mosca.
Monastero che dà il nome alla via dove si trova: Petrovka.
Questo #monastero che sa in parte di Italia è un'isola di pace e di silenzio nel cuore pulsante della capitale.
🎞 Nel video scoprirete alcuni dettagli del monastero, soprattutto il Refettorio, aperto al pubblico.
✅ Per non perdere i prossimi video da Mosca iscriviti al mio canale YouTube!
#tatianasanti
Link del video 👇
https://youtube.com/shorts/9BzK5HpeJ5c?si=nIuITQBwp_IvW-w2
SEGUI Tatiana Santi:
Telegram | YouTube | Sito Web
📱Donazioni
⚡️La #Siria ha chiuso completamente lo spazio aereo sopra il Paese, riferiscono i controllori di volo.
Lo spazio aereo del #Bahrain rimarrà chiuso fino al mattino, ha riferito alla TASS una fonte nei circoli di controllo aereo.
SEGUI Tatiana Santi:
#tatianasanti
Telegram | YouTube | Sito Web
📱Donazioni
Lo chiamano "#Armageddon"
A Mosca è scesa tantissima #neve, strade tutte bianche, macchine che puliscono le vie del centro, cumuli bianchissimi e soffici ovunque.
Lo chiamano "Armageddon", un ciclone che ha portato sulla capitale bufere di neve anomale.
A me piace un sacco.
Buona notte a tutti
#tatianasanti
SEGUI Tatiana Santi:
Telegram | YouTube | Sito Web
📱Donazioni