Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Referendum giustizia, #AVS ha detto che riserverà agli elettori fuorisede i propri posti per ricoprire il ruolo di rappresentanti di lista ai seggi, in modo che possano votare nel seggio al quale sono assegnati, anche se diverso da quello in cui sono residenti. (ilPost)
@UltimoraPolitics24
#AI#AVs
Помимо сильного положительного влияния на роботов, развитие LLM также хорошо влияет на развитие автономных технологий в грузо- и пассажироперпвозках. Поэтому инвестиции в компании разрабатывающие беспилотные авто и грузовики это тоже ахуенная тема.
Тейки все такие же. И про снижение себестоимости тоже при росте объемов беспилотных машин в автопарках компаний-операторов грузо- и пассажироперевозок.
Скрины в этом посте из того же репорта BofA, что прикреплен выше. В посте ниже ща закину репорт Goldman Sachs по AVs где больше прогнозов по кол-ву машин, penetration в существующий автопарк и прогноз себестоимости производства AVs
Из таких компаний держу Pony AI и WeRide
La #Camera approva con 299 sì la risoluzione di maggioranza che impegna il governo a "evitare che arrivino fondi ad Hamas che siano utilizzati per finanziare attacchi terroristici e incitare all'odio verso Israele". Approvate anche le tre risoluzioni presentate dalle opposizioni, con lo stralcio (in quella di #M5S-#PD-#AVS) della parte relativa all'insediamento dei coloni in Cisgiordania
@UltimoraPolitics
No all'introduzione del salario minimo: la #Camera approva la mozione di maggioranza con 163 voti a favore, 121 no (#M5S, #PD e #AVS) e 19 astenuti (Terzo Polo). Respinti i testi delle opposizioni
@UltimoraPolitics
Decreto Pa 2, il governo ritira l'emendamento che introduceva cinque dipartimenti al Ministero della Cultura. Esultano #PD, #M5S, #Azione e #AVS.
@UltimoraPolitics
Aboubakar #Soumahoro (#AVS) lancia un appello a tutti i partiti di opposizione: "Saliamo sulle navi dei migranti, per far valere i principi di umanità racchiusi nella nostra bella e attuale Carta costituzionale"
@UltimoraPolitics
Il tribunale di Catania accoglie il ricorso di un migrante, sbarcato a Lampedusa e portato nel Cpr di Pozzallo, giudicando il recente decreto del governo "illegittimo in più parti": i giudici contestano la nuova procedura di trattenimento e la cauzione da circa 5.000 euro da pagare per non andare nel centro. #FdI: "Decisione politica e ideologica". #Bonelli (#AVS): "Meloni porta avanti una campagna di distrazione di massa che punta a trasformarla in vittima di un complotto per nascondere le sue incapacità"
@UltimoraPolitics
#Senato
Approvate le risoluzioni di maggioranza, PD e Terzo Polo, alle comunicazioni del ministro della Difesa, Guido #Crosetto, sul rinnovo dell'autorizzazione all'invio di mezzi militari all'Ucraina. La prima ha ottenuto 143 sì, 29 no e un astenuto. Le altre due 144 voti favorevoli e 28 contrari. Le risoluzioni di #AVS e #M5S non sono state votate
@UltimoraPolitics
Confermata in Cassazione la condanna a un anno e sei mesi inflitta per un reato di falso dalla Corte d'appello di Reggio Calabria nell'ottobre 2023 a Mimmo #Lucano, ex sindaco di Riace, oggi eurodeputato nelle liste di #AVS
@UltimoraPolitics
#Camera
Scontro tra #Meloni e Angelo #Bonelli (#AVS), che ha mostrato due sassi raccolti dal letto del fiume Adige in secca per criticare il governo sul modo con cui sta gestendo il problema della siccità nel Nord Italia. La premier replica: "Non sono Mosè"
@UltimoraPolitics