Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🇪🇸 #Spagna – Il governo ha approvato un decreto per regolarizzare circa 500.000 migranti (la maggior parte latinoamericani) che risiedono nel Paese da almeno cinque mesi e che hanno presentato domanda di protezione internazionale. La misura riguarderà anche…
🇪🇸#Spagna – Il governo ha approvato un decreto per regolarizzare circa 500.000 migranti (la maggior parte latinoamericani) che risiedono nel Paese da almeno cinque mesi e che hanno presentato domanda di protezione internazionale. La misura riguarderà anche i loro figli. I richiedenti dovranno dimostrare di non avere precedenti penali.
@UltimoraPolitics24
🇪🇸#Spagna – Il governo annuncia che da gennaio 2026 sarà possibile pagare un abbonamento unico per autobus a lunga percorrenza, treni pendolari e treni a media percorrenza: costerà 60 euro al mese, o 30 euro per gli under-26. Sarà valido su tutto il territorio nazionale.
@UltimoraPolitics24
🇪🇸#Spagna — Urne chiuse per le elezioni generali. Divulgati gli intentional poll (sondaggi condotti durante il divieto di diffusione ma prima del voto di oggi): 150 seggi ai popolari. La maggioranza posta al Congresso è di 176. Exit poll e primi dati ufficiali dalle 21
@UltimoraPolitics
#Spagna: La Casa Bianca annuncia che la Spagna ha accettato di collaborare militarmente con gli Stati Uniti.
Nei giorni scorsi il Governo spagnolo ha negato l’uso delle basi agli aerei statunitensi.
#Spagna
Un approfondimento sulla nuova “Ley de deporte” spagnola, con una particolare attenzione all’intreccio tra lo sport e tematiche sociali come la disparità di genere e la disabilità
https://telegra.ph/La-nuova-Ley-de-deporte-spagnola-12-24-3
👉@giurisprudentia
🇪🇸 Elezioni in #Spagna, dati del Ministero dell'Interno (100% scrutinato)
Partido Popular 136 seggi
PSOE 122
Vox 33
Sumar 31
Esquerra Republicana de Catalunya 7
Junts x Catalunya 7
Euskal Herria Bildu 6
Partido Nacionalista Vasco 5
Bloque Nacionalista Gallego 1
Coalición Canaria 1
Union del Pueblo Navarro 1
PP+Vox 169
PSOE+Sumar 153
Maggioranza assoluta: 176 su 350
Per la diretta delle elezioni spagnole seguiteci su Twitter: https://twitter.com/you_trend
🔴🇪🇸 Elezioni in #Spagna - intention poll Sigmados per RTVE, stima seggi:
PP 145-150
PSOE 113-118
Sumar 28-31
Vox 24-27
Soglia della maggioranza assoluta: 176 su 350
Secondo questi dati, al momento non è chiaro se PP e Vox avranno i numeri sufficienti per raggiungere la maggioranza assoluta dei seggi, poiché la loro forchetta oscilla tra 169 e 177 seggi
Diffuso dalla Sala Stampa vaticana il logo del Viaggio Apostolico che Papa #LeoneXIV compirà in #Spagna dal 6 al 12 giugno. L'immagine è strutturata come un cerchio aperto in movimento, formato da figure umane unite tra loro e orientate verso l’alto.
Questa composizione esprime comunità, incontro e sostegno reciproco: non si tratta solo di stare insieme, ma di camminare uniti verso una meta comune. La Vergine Maria, posta al centro, rappresenta il cuore del movimento: presenza materna che accoglie e orienta gli sguardi verso Dio, segno di unità e di speranza per tutto il popolo.
Il motto scelto, “Alzad la mirada” (Gv 4,35), è un invito a sollevare lo sguardo oltre le preoccupazioni quotidiane per riscoprire la presenza di Dio e aprirsi agli altri. È un invito alla speranza e alla contemplazione, che esorta a non chiudersi in sé stessi ma a ritrovare l’unità, la bellezza e la carità come segni concreti di una vita condivisa.
In questo gesto di “alzare lo sguardo” si esprime anche l’atteggiamento con cui la Chiesa in Spagna accoglie la visita del Santo Padre: con il cuore aperto e pronto a camminare insieme.
Questa mattina, Papa #LeoneXIV ha ricevuto in udienza, nel Palazzo Apostolico Vaticano, Re Felipe VI e la Regina Letizia di #Spagna. I Reali si sono successivamente incontrati col Cardinale Pietro Parolin, Segretario di Stato di Sua Santità, accompagnato da mons. Paul Richard Gallagher, Segretario per i Rapporti con gli Stati e le Organizzazioni Internazionali.
"Nel corso dei cordiali colloqui in Segreteria di Stato - si apprende dalla Sala Stampa vaticana - si è espresso compiacimento per le buone relazioni tra la Santa Sede e la Spagna, che avranno un momento significativo nel prossimo Viaggio Apostolico del Santo Padre. In tale contesto, si è fatto riferimento ad alcune questioni di attualità che riguardano la situazione del Paese e la missione della Chiesa nella società. Infine, ci si è soffermati su alcuni temi di carattere regionale ed internazionale, rilevando l’importanza di un impegno costante a sostegno della pace e del rafforzamento dei principi e dei valori che stanno alla base della convivenza internazionale".
Lasciato il Vaticano, i Reali di Spagna hanno raggiunto la basilica papale di Santa Maria Maggiore per la presa di possesso, da parte del Re, della carica di Protocanonico del Capitolo Liberiano.