Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🗼Новый символ Анкары - Atatürk Cumhuriyet Kulesi - откроется в годовщину Победы при Чанаккале
18 марта - в 109-ю годовщину Победыв битве приЧанаккале - для жителей и гостей столицы откроет свои двери «Башня Республики Ататюрка», которая ознаменует собой 100-летие Турецкой Республики
Фундамент 197-метровой башни был заложен в столичном муниципалитете Кечиёрен (Keçiören) еще в 2003 г., однако строительство на некоторое время было приостановлено. Теперь работы завершены, и башню планируется открыть в понедельник, 18 марта, с участием президента Эрдогана.
В здании башни разместятся художественная галерея, где планируется проводить международные выставки, библиотека, тренажерный зал, торговый центр, на высоте 190 м. зал свадебных церемоний, на высоте 140 м. - космическая терраса и научный центр, а также кафе и вращающийся ресторан.
Башня, спроектированная архитектором Атакуле Рагыпом Булучем (Ragıp Buluç), имеет сейсмоустойчивую конструкцию. Увенчанная на вершине «Звездой Сельджуков» - общим наследием турецкой культуры, - в вечерние часы она будет освещаться системой светодиодных экранов.
Башня Республики Ататюрка должна стать новым символом столицы, с вершины которой посетители получат возможность наблюдать за мегаполисом с высоты птичьего полета ☸️
📍 Ankara #Ankara
Turkuaz / Турецкий цвет
Видео: HaberTurk
#Turchia: le operazioni della polizia si diffondono anche nel municipio di #Ankara; con l'accusa di corruzione, in merito ai concerti organizzati 4 anni fa, oggi sono finite in manette 13 persone.
#Turchia: una nuova ondata di vittime dell'alcol di produzione clandestina, a #Ankara sono 33 le persone morte e 20 sono in terapia all'ospedale, in pochi giorni.
#Turkey deploys F-16 jets in #Somalia
Turkey has deployed F-16 fighter jets to Somalia, officials told AFP on Thursday, as #Ankara seeks to expand its military footprint in the Horn of Africa.
Ankara is a key ally of Somalia, providing extensive military and economic support to the country, which has been ravaged by civil war since the early 1990s.
"Turkey has deployed F-16 jets in Somalia," a government official told AFP, without giving further details. A second official, also speaking on condition of anonymity, said the aircraft would be operated by the Turkish contingent stationed in Somalia.
"This is for our own security," the source said, stressing that the jets would not be flown by Somali personnel. Turkey opened its largest overseas military base in the Somali capital Mogadishu in 2017.
Ankara maintains a task force and an air component command there "to contribute to ....
https://web.facebook.com/AddisstandardEng/posts/pfbid032KptiLG37NfJxJbwbCJx3WCHVdMJaKhytXTrgYP3tyZF5EPKCnXVib7TjwimxGdpl
Turkish President Recep Tayyip Erdoğan said that Turkey would never want to see new conflict in the Horn of Africa, emphasizing the need for stability and encouraging countries in the region to address challenges through cooperation and dialogue.
Erdoğan emphasized respect for sovereignty and territorial integrity, cautioning against external geopolitical competition in the Horn. He reiterated #Ankara’s position that potential recognition of #Somaliland by #Israel would not contribute positively to regional stability.
He also welcomed diplomatic engagement between #Ethiopia and #Somalia, noting Turkey’s mediation efforts aimed at easing tensions.
https://addisstandard.com/?p=55223
#Iran – Esmail Baghaei, portavoce del Ministero degli Esteri:
"Confidiamo in una rapida conclusione dei negoziati con gli #USA per la rimozione delle sanzioni. Un ringraziamento particolare a #Ankara per il ruolo di mediazione."
Il dodicesimo anniversario della rivolta popolare di #Gezi, ieri sera, è stato commemorato anche a #Ankara/#Turchia. Il presidio si è concluso con l'intervento della polizia, 15 persone in detenzione provvisoria.
#USA: Due senatori presentano la proposta di sanzioni contro #Ankara/#Turchia da attivare nel caso di un rifiuto della tregua e di una zona demilitarizzata in #Rojava/#Siria.