Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Пилоты подрались в кабине во время рейса. Один даже швырнул в напарника портфелем
Два пилота A320 авиакомпании Air France подрались в кабине вскоре после вылета из Женевы в Париж ✈️
Как пишет газета La Tribune, ссора возникла из-за того, второй пилот отказался выполнить команду КВС, тот дал ему пощёчину, второй пилот швырнул в командира портфелем, далее завязалась потасовка; разнимать пилотов пришлось бортпроводникам, которые услышали шум.
Правда, тут французские журналисты, очевидно, подвирают, поскольку бортпроводник не может самостоятельно открыть дверь в кабину пилотов – её могут открыть только сами пилоты, поэтому очевидно, что они к тому времени уже прекратили драться. Однако после этого один из бортпроводников остался в кабине в кресле инструктора, чтобы конфликт не разгорелся вновь.
Авиакомпания заявила, что инцидент не повлиял на безопасность полёта, однако оба пилота были отстранены от полётов и находятся под следствием.
Лёгкое небо
#aviation#news#ГА#AirFrance
🇶🇦Европейские авиакомпании требуют аннулировать авиасоглашение с Катаром
📌Lufthansa, Air France, KLM и SAS обратились к главе Еврокомиссии с требованием аннулировать авиасоглашение ЕС с Катаром, подписанное в октябре 2021 года
🔵Поводом стало увольнение высокопоставленного чиновника ЕС, обвинённого в коррупции – в том числе в получении бесплатных перелётов Qatar Airways для себя и семьи
🔵По мнению европейских перевозчиков, соглашение предоставляет катарским авиакомпаниям неограниченный доступ к рынку ЕС и создаёт недобросовестную конкуренцию. Заявители настаивают, что документ не может действовать, пока остаются подозрения в коррупции при его заключении
🔵Власти Катара опровергли обвинения, заявив о полном соответствии законам. Qatar Airways ситуацию пока не прокомментировала
🤩Лёгкое небо
#aviation#news#Qatar#Lufthansa#AirFrance
#Updates: #Lufthansa, #TurkishAirlines, #AirFrance cancel Saturday flights to and from Tel Aviv, Middle East capitals
The German airline group Lufthansa said in a statement that it and its subsidiaries were suspending flights to and from #Dubai and #Abu_Dhabi until Sunday, citing the “current situation in the Middle East.”
Air France also cancelled its Saturday flights to and from #Tel_Aviv and #Beirut after the United States and Israel launched strikes on Iran, adding that it would provide further updates on its schedule in the coming days.
“Due to the security situation at the destination, the airline has decided to cancel its flights scheduled for February 28 to/from Tel Aviv and to/from Beirut,” Air France told AFP. “Air France will communicate later on its flight schedule to these destinations for the coming days,” it added.
#Iran, #Iraq, and #Israel have closed their airspace....
https://web.facebook.com/AddisstandardEng/posts/pfbid0EDj1My2WPSW3gr88dM7ioLeeMBhKoSBY7D9anWKrrFGsHXAxBFLG5w1seq733Qk1l