Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Indagato per falso e finanziamento illecito l’ex ministro ed attuale presidente del CNEL, Renato #Brunetta: avrebbe venduto le sue quote di una società di prodotti sanitari al suo vice capo di gabinetto al ministero della Pubblica amministrazione. L’ipotesi degli investigatori è che Brunetta abbia modificato alcuni documenti per nascondere il passaggio di 60.000 euro, che servivano per cedere le quote
@UltimoraPolitics
#Italia Renato #Brunetta (#FI|EPP): "Non votando la fiducia a Draghi Forza Italia ha tradito la sua storia e i suoi valori. Non sono io che lascio, è FI che lascia se stessa." @UltimoraPolitics
#Italia
Renato #Brunetta (#FI|EPP): "Non votando la fiducia a Draghi Forza Italia ha tradito la sua storia e i suoi valori. Non sono io che lascio, è FI che lascia se stessa."
@UltimoraPolitics
#Italia#Elezioni2022
Renato #Brunetta annuncia che non si ricandida per le politiche: "Resto dove sono, non vado da nessuna parte. Rimarrò fino alla fine a onorare con orgoglio il mio impegno da ministro del Governo Draghi, nel perimetro degli affari correnti. Ho dato tanto alla politica e tanto ho ricevuto. Nessun rammarico e nessun rimpianto, semmai un po' di dolore"
@UltimoraPolitics
#Italia
In caso di conferma delle dimissioni di Mario #Draghi, il ministro #Brunetta (#FI|EPP) guiderà il paese fino alle prossime elezioni.
@UltimoraPolitics
#Italia
❗️L'Espresso - Mariastella #Gelmini sarebbe entrata in #Azione, nelle prossime ore l'annuncio. Anche #Brunetta si muove nella stessa direzione.
@UltimoraPolitics
La moglie di #Brunetta, Tommasa Ottaviani Giovannoni, è stata condannata a versare 20.000€ a Matteo #Renzi dal tribunale di Firenze: nel 2016 postò con uno pseudonimo la foto di #Delrio accanto all'ex premier e ai ministri #Lotti e #Boschi e scrisse: "Ho le foto di Delrio coi mafiosi".
@UltimoraPolitics
https://x.com/SavinoBalzano/status/1823033087023878315?t=_YbyQYq1eRqdqs1kVbEY8Q&s=19
Giuseppe Conte torna alla carica con la nenia lacrimosa sul #SalarioMinimoLegale.
I salari italiani perdono potere d'acquisto, siamo fanalino d'#Europa, e il #Governo è insensibile al lamento di dolore di tanti italiani.
Certo, moltissimi nei commenti gli domandano come mai una legge del genere, assai semplice nella sua struttura rispetto ad altri provvedimenti, non l'abbia varata lui quando era a Palazzo Chigi. I salari andavano bene? Direi di no. Quindi era insensibile anche lui quando guidava l'esecutivo?
Cita #Brunetta, per infangare la posizione del Governo, e ha gioco facile: in effetti vederlo a capo del Consiglio Nazionale dell'Economia e del Lavoro mi fa sanguinare gli occhi (parliamo di uno che aggrediva verbalmente un contestatore solo in quanto lavoratore dipendente). Per non ricordare tanti e tanti altri aneddoti che ne tracciano una figura davvero sgradevole, da ogni punto di vista.
Però è una furbata: è come quando dicono che certa roba non va bene perché era nel programma di #LicioGelli. È un espediente retorico vuoto, privo di argomentazioni.
Il #SalarioMinimo è una misura che inciderebbe su una parte assai marginale di retribuzioni (rischiando, da sola, di fare più danni che altro): a perdere potere d'acquisto, invece (come lo stesso #Conte peraltro scrive senza rendersi conto della contraddizione), sono tutte le retribuzioni, di quasi ogni settore, la stragrande maggioranza delle quali è ben oltre la soglia che si vorrebbe introdurre.
Il problema è sistemico, strutturale, frutto di scelte sbagliate compiute in decenni e decenni: davvero pensa che un disastro del genere lo si metta a posto con una leggina sul salario minimo? Il salario minimo fissato per legge non interviene sulle ragioni profondissime del problema. Somministrare la morfina a uno che si è rotto il femore produce giovamento, ma lo aiuterà a riprendere a correre? E un tempo le nostre retribuzioni correvano eccome e, vi svelo un segreto, non c'era una legge sul salario minimo.
È risibile, fumo negli occhi, non si interverrebbe minimamente sulle cause reali, strutturali, che hanno comportato il disastro: in primis politiche economiche regressive, austere, imposte dalle tecnocrazie eurounitarie, che hanno fatto esplodere la disoccupazione. La disoccupazione ha comportato una perdita di potere contrattuale della comunità del lavoro, dell'offerta di lavoro nel mercato: con conseguente perdita di valore del prodotto, il lavoro, e di potere contrattuale dei produttori, i lavoratori.
Ha inciso anche sulla capacità di presidiare i diritti acquisiti, difatti è esplosa la precarietà. Essa ha reso ricattabili le persone e reciso il rapporto tra lavoro e democrazia di cui all'art. 1 della Costituzione, tarpando le ali alle dinamiche rivendicative, anche salariali.
Durante l'esperienza di governo giallo-verde, pare che lo avesse chiaro in testa: varò il #DecretoDignità, un ottimo inizio per invertire la rotta e sistemare tutti i danni che il suo principale alleato, il #PD, ha arrecato al mondo del lavoro, sostenendo le follie dell'#UE e precarizzando come non ci fosse un domani (nel silenzio o quasi della #CGIL, che al tempo non voleva disturbare il partito di governo, col quale peraltro la Segreraria Generale si sarebbe candidata per approdare in Parlamento. Le coincidenze di tale Camusso, che però restano interessanti perché dubito che vedremo Landini in futuro nelle liste di #FDI o della #Lega).
Il problema è però proprio nel nuovo corso di #GiuseppeConte: oggi non può proprio permettersi di irritare la premier (che Dio non voglia!!!) di un suo eventuale nuovo governo, #EllySchlein.
Caro Giuseppe, lo sai che le cose stanno così: un tempo eri tu a parlare di sovranità e popolo e fa davvero pena questo atteggiamento, questa specie di severa postura, che in realtà è genuflessione.