Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
"Si apprende con soddisfazione che oggi è stata riconosciuta civilmente la dignità episcopale di S.E. Mons. Giuseppe Zhang Weizhu, Vescovo emerito della Prefettura Apostolica di Xinxiang (Henan, #Cina continentale). Tale provvedimento è frutto del dialogo tra la Santa Sede e le Autorità cinesi e costituisce un nuovo importante passo nel cammino comunionale della circoscrizione ecclesiastica". Lo afferma il direttore della Sala Stampa della Santa Sede in una dichiarazione diffusa tramite il consueto bollettino quotidiano.
🗞️ Oggi su Libero un mio lungo approfondimento sull'offensiva culturale della #Cina al Salone di Torino.
Gli stand del Dragone sono sempre di più, TikTok, che negli Stati Uniti vogliono oscurare, qui è "Official Entertainment partner", le case editrici diretta espressione del governo cinese pubblicano libri di favole per bambini per invitarli ad imparare il mandarino, gli Istituti Confucio (in Usa, Australia e UK in molti casi sono state fatte chiudere) organizzano numerosi eventi.
È lo sharp power del Celeste Impero, le cui rinnovate linee guida ideologiche sono state tracciate di recente da Xi Jinping in persona e diffuse dal "Centro di ricerca del pensiero" fondato di recente a Pechino.
La premier Giorgia #Meloni in visita in #Cina incontra il presidente Xi Jin Ping: “La Cina è fondamentale per la stabilità e la pace. Penso che l'Italia possa avere un ruolo importante anche per quello che riguarda le relazioni con l'Unione Europea ed il creare rapporti commerciali che siano il più possibile equilibrati. La Cina per noi è un partner economico, commerciale, culturale di grande rilievo”
@UltimoraPolitics
La premier Giorgia #Meloni in visita in #Cina durante il bilaterale con il primo ministro della Repubblica Popolare Cinese, Li Qiang nella Grande Sala del Popolo a Pechino: “Sono molto contenta di essere qui per il primo viaggio ufficiale che è stato anticipato da diversi incontri di alto livello a dimostrazione della volontà di iniziare una fase nuova, di rilanciare la nostra cooperazione bilaterale nell'anno in cui ricorre il ventesimo anniversario della nostra partnership strategica globale”.
@UltimoraPolitics
#Italia#Cina
Il Governo ha emanato nel Consiglio dei Ministri di giovedì 9 il nuovo decreto Golden Power su Pirelli. Il provvedimento adottato mira a tutelare nuovamente le tecnologie di cui dispone la società, in particolare il Cyber Tyre. Per limitarne l'influenza, al socio cinese CNRC viene imposta la presentazione di una lista per il rinnovo del Cda (composto di 15 membri in totale) limitata a tre amministratori, di cui due indipendenti, e senza la possibilità di rivestire cariche apicali quali Presidente o Amministratore Delegato.
@OsservatorioItaliano
#Iran, #Cina: Secondo quanto appreso dalla CNN da fonti di intelligence statunitense, ci sarebbero segnali che la Cina si starebbe preparando a fornire supporto economico e logistico all'Iran, con aiuti finanziari e componenti per l'industria missilistica.
#Iran, #Cina: La Cina ha chiesto di mantenere aperto lo Stretto di Hormuz dopo che l'Iran ha colpito diverse navi che ci passavano.
"La Cina chiede a tutte le parti di sospendere immediatamente le operazioni miitari, evitare l'escalation, salvare le linee commerciali nello Stretto di Hormuz ed evitare danni maggiori all'economia globale" ha dichiarato il portavoce del Ministro degli Esteri cinese Mao Ning.
#Iran, #Cina: La Cina condanna gli attacchi all'Iran da parte di Israele e Stati Uniti, offre il suo supporto morale a Teheran e chiede una de-escalation immediata.
#USA#Cina
Gli Stati Uniti e la Cina, in un comunicato congiunto, hanno annunciato il raggiungimento di un accordo sui dazi mutualmente imposti nelle scorse settimane. Entrambe le parti hanno deciso, per un periodo iniziale di 90 giorni, di ridurre i rispettivi dazi, con gli USA che abbasseranno quelli sulle merci cinesi dal 145% al 30% mentre la Cina sulle merci statunitensi dal 125% al 10%. I due Paesi inoltre creeranno un “meccanismo per continuare le discussioni sulle reazioni economiche e commerciali”.
@OsservatorioEsteri
#Cina#USA
Reuters riporta che il Ministero del Commercio ha dichiarato che la Cina ha vietato le esportazioni verso gli USA di articoli legati ai minerali gallio, germanio e antimonio che hanno potenziali applicazioni militari, un giorno dopo l'ultimo giro di vite di Washington sul settore cinese dei chip.
La direttiva di Pechino sui cosiddetti prodotti a duplice uso, sia civile che militare, che cita preoccupazioni per la sicurezza nazionale, ha effetto immediato e richiede anche una revisione più rigorosa dell'uso finale dei prodotti di grafite spediti negli USA.
"In linea di principio, l'esportazione di gallio, germanio, antimonio e materiali superduri negli USA non sarà consentita", ha dichiarato il Ministero.
@OsservatorioEsteri
❗#Trump afferma che gli #USA imporranno un ulteriore dazio del 50% sulla #Cina, a partire da mercoledì, se la misura di ritorsione (dazi al 34% su prodotti USA) non verrà ritirata.
@UltimoraPolitics