Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
⌛️#accaddeoggi⏳
8 Agosto 1956: Scoppia un incendio nella miniera belga di Marcinelle. Morirono 262 persone, di cui 136 italiani. L'evento, causato da un incendio che in breve tempo riempì di fumo l'intero impianto di areazione, fu uno dei peggiori disastri minerari di sempre e il terzo, in ordine di vittime, per quanto riguarda gli immigrati italiani all'estero.
📌 Accadeva anche...
🏛 LaNostraStoria
⌛️#accaddeoggi⏳
14 Maggio 1955: Viene siglato il Patto di Varsavia tra Unione Sovietica, Ungheria, Romania, Polonia, Germania dell’Est, Cecoslovacchia, Bulgaria, Albania. Il nome esteso del patto era “Trattato di amicizia, cooperazione e mutua assistenza” e di fatto venne concepito come l’antitesi della NATO, dalla quale l’URSS era stata rifiutata, e nella quale, non a caso, la Germania dell’Ovest era entrata solo una settimana prima. Il mondo venne a trovarsi così diviso in due blocchi ostili.
Il Patto fu costituito da undici articoli ma quello fondamentale, per la storia degli anni successivi, fu il quarto che imponeva la reciproca difesa e la mobilitazione degli eserciti dei singoli alleati in caso di aggressione a uno dei paesi aderenti. Questa alleanza durò per 36 anni. Il Patto di Varsavia venne sciolto nel 1991 a Praga e successivamente quasi tutti i paesi ex membri fecero il loro ingresso nella NATO.
📌 Accadeva anche...
🏛 LaNostraStoria
⌛️#accaddeoggi⏳
7 Maggio 1945: La Germania, rappresentata dal generale Jodl, firma con gli alleati a Reims la resa incondizionata del Reich. Questa entrò in vigore il giorno successivo ma, per volere di Stalin, venne firmata una seconda resa la sera dell'8 maggio, già il 9 nell'orario di Mosca. Per questo motivo la Russia riconosce da allora il 9 maggio come giornata della Vittoria.
📌 Accadeva anche...
🏛 LaNostraStoria
San Patrizio non è solo trifogli, cappellini verdi e birra .
È anche storia, rivolta, sangue versato per l’identità di un popolo.
Oggi, giorno in cui l’Irlanda viene celebrata nel mondo, vi portiamo davanti alla tomba di Bobby Sands a Milltown Cemetery, Belfast.
Un ragazzo di 27 anni che ha scelto di morire per difendere la libertà di un popolo intero.
La lotta non è finita con lui nel 1981.
Vive ancora in ogni pietra, in ogni ricordo.
Buon Lá Fhéile Pádraig, ma ricordate: l’Irlanda vera porta anche cicatrici. 🇮🇪
#irlanda#accaddeoggi#storia#politica#notizie
Ci sono pagine di storia poco raccontate perché parlano di persone comuni.
Di case rubate.Di notti interrotte. Di vite spezzate nel silenzio.
Tra il 1943 e il 1947 migliaia di italiani dell’Istria, di Fiume e della Dalmazia furono portati via così: senza spiegazioni, senza ritorno.
Molti vennero gettati nelle foibe.
Senza un nome. Senza una tomba.
E chi sopravvisse fu costretto a lasciare tutto: la propria terra, i ricordi, l’identità.
Oltre 250.000 persone in fuga con una valigia piena di assenze.
E all’arrivo, spesso, insulti e diffidenza.
Per troppo tempo questa storia è stata ignorata.
Ma il dolore non sparisce se lo cancelli.
#italia#storia#foibe#accaddeoggi#storiaitaliana
Pasqua non è solo resurrezione, è trasformazione.
Nel caos di oggi, il vero cambiamento è interiore: restare lucidi, consapevoli e umani.
Rinascere non è tornare come prima, è diventare qualcosa di nuovo.
#accaddeoggi#storia#pasqua#cristianesimo#notizie
L’Inno d’Italia non è “vecchio”, non è “retorico” e non è “fa*cista”.
È semplicemente più serio di noi.
Il 10 dicembre 1847 è nato un Paese che ancora non c’era.
La domanda oggi è: siamo ancora all’altezza di quelle parole?
Scrivilo nei commenti👇🇮🇹
Tu lo senti ancora tuo?
#accaddeoggi#storia#italia#roma#milano#governo#oggi#fatti#avvenimenti#storico#politica#politicaitaliana#destra
Film per Halloween? Non solo paura.
“L’Esorcismo di Emily Rose” è un viaggio tra fede e scienza, tra luce e ombra.
Un processo alla verità dove il demone non è solo un mostro da scacciare… ma qualcosa (o qualcuno) che vive dentro di noi.
Ispirato a una storia vera, questo film ci costringe a guardare negli occhi ciò che non vogliamo vedere: la sottile linea tra mente e mistero, tra Bene e Male.
E se i demoni non ci possedessero… ma fossimo noi a dar loro forma?
Questo Halloween, più che spaventarti, prova a riflettere.
Il vero orrore, forse a volte, è conoscere se stessi.
#halloween#halloween2025#horror#film#cinema#cinemahorror#accaddeoggi#oggi#occulto
Diciott’anni e un ideale.
Oggi abbiamo tutto, ma non crediamo più in niente.
Sergio Bresciani non giocava a fare l’uomo:
Lo era davvero.
#storia#accaddeoggi#guerra#politica#italia#storiaitaliana#oggi#fatti#eventistorici#eventi#accadevaoggi#ricorrenze#ricorrenza