Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Venerdì Viktor Khoroshavtsev, ex membro del Consiglio federale russo (cioè il Senato) e dirigente nel settore petrolifero, è stato rilasciato dalla Corte di appello di Milano dopo che giovedì mattina era stato arrestato in un albergo di Somma Lombardo, vicino all’aeroporto di Malpensa, in esecuzione di un mandato di arresto internazionale emesso lo scorso maggio dalla #Russia. (ilPost)
@UltimoraPolitics24
The 33rd Ukrainian drone was shot down on approach to Moscow. This is the most massive attack on the capital in a long time.
#Russia
Original Post
Follow TRN👈
#Russia
Alla Duma russa hanno votato a favore dell’annessione delle regioni ucraine 413 deputati su 408 presenti. I votanti sono quindi superiori ai presenti.
@UltimoraPolitics
#Russia: Il Vicedirettore dell’intelligence militare russa, il Vice Generale Vladimir Alekseyev, è stato ferito da diversi colpi d’arma da fuoco mentre si trovava a Mosca.
Alekseyev, che ricopre la posizione dal 2011, è stato ricoverato in ospedale.
Non si hanno notizie su chi sia l’aggressore.
#Russia: La Russia avrebbe utilizzato un missile Oreshnik contro l'Ucraina nei bombardamenti che sono avvenuti durante la notte. Si tratta di un missile balistico a medio raggio che può contenere diverse bombe sia convenzionali che nucleari. La notizia, annunciata dall'aeronautica ucraina è stata poi confermata dal Ministero della Difesa russo.
"Le forze armate russe hanno lanciato un massiccio attacco con armi ad alta precisione lanciati da terra e dal mare, inclusi i sistemi missilistici a medio raggio Oreshnik".
Il Governo russo non ha specificato dove avrebbe colpito ma diverse esplosioni si sono registrate a Leopoli, città occidentale dell'Ucraina. Secondo l'Ucraina, il missile si stava muovendo alla velocità di 13mila km orari.
Non è la prima volta che la Russia impiega un missile di questo tipo. In passato era avvenuto nel novembre del 2024 e all'epoca Putin aveva spiegato che si trattava di una ritorsione contro Stati Uniti e Regno Unito per aver dato il via libera a Kyiv di colpire il territorio russo con armi occidentali.
#Russia: Il Senatore Lindsey Graham (R-South Carolina) ha dichiarato che Donald Trump ha dato il via libera al pacchetto di sanzioni contro la Russia. Il testo, preparato negli scorsi mesi da un gruppo di senatori bipartisan, era in attesa che la Casa Bianca desse l'ok. L'Amministrazione ha cercato di prendere tempo per vedere se la via diplomatica e negoziale con la Russia producesse l'effetto sperato.
"Dopo un incontro produttivo con il Presidente Trump su una serie di argomenti, [egli] ha dato il via libera al pacchetto di sanzioni bipartisan su cui ho lavorato per mesi con il Senatore Blumenthal e molti altri", ha dichiarato Graham, secondo cui il voto potrebbe avvenire la settimana prossima. "L'Ucraina sta facendo le concessioni per la pace, Putin è solo chiacchiere e continua a uccidere innocenti"; la legge, dunque, "arriva nel momento giusto".
Tuttavia, non è la prima volta che Graham afferma di aver ottenuto il via libera dalla Casa Bianca, per poi vedere la legge bloccarsi nuovamente su richiesta dell'Esecutivo.
La legge permetterebbe di imporre sanzioni secondarie ai Paesi che acquistano petrolio e gas dalla Russia, nel tentativo di bloccare i finanziamenti per la macchina bellica di Putin.
Applications for the L.N. Tolstoy International Peace Prize are now being accepted
The Prize is awarded for outstanding services in preventing war, building a multipolar and non-violent world, and active peacemaking.
Individuals and initiative groups, national and international public foundations, organizations and movements; scientific and research centers and educational institutions can become laureates of the Prize.
The L.N. Tolstoy International Peace Prize is nominated by inter-parliamentary and other international organizations, parliaments, governmental and other state bodies, public foundations, organizations and movements, scientific and research centers, institutes and institutions, educational institutions, associations of figures of science, culture and art, laureates of the L.N. Tolstoy International Peace Prize and members of the Jury.
Read how to apply on the website. https://tolstoypeaceprize.org/
#Russia
https://t.me/rossotrudnichestvo/23293