Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🚢AIDA Cruises отменяет ближневосточный сезон 2026–27.
Немецкая круизная компания AIDA Cruises объявила об отмене всей программы круизов на Ближнем Востоке в зимнем сезоне 2026–2027 годов.
Решение касается всех рейсов лайнера «AIDAprima», запланированных с 19 октября 2026 года по 20 мая 2027 года.
Компания объяснила этот шаг геополитической нестабильностью в регионе и невозможностью оценить уровень безопасности для пассажиров и экипажа. В связи с этим отменены и переходные круизы вокруг Африки, сопровождающие сезонную смену региона работы судна.
Единственный рейс, который сохранится в расписании, — «Western Europe Highlights from Hamburg 1», в период 19 октября – 1 ноября 2026 г между Гамбургом и Лас-Пальмасом.
Пассажирам отменённых рейсов предложено бронировать путешествия на иные маршруты флотаAIDA Cruises - Карибский регион, Канарские о-ва и Средиземноморье.
Аналогичные корректировки уже проводят и другие круизные операторы, включая Costa Cruises, которые также перераспределяют флот из нестабильных регионов в более безопасные направления.
📌AIDA Cruises — немецкая круизная компания, основанная в 1996 году.
Бренд входит в состав Carnival Corporation & plc, крупнейшего круизного оператора мира. Флот компании насчитывает более 10 круизных лайнеров, работающих на европейских и мировых маршрутах.
#CruiseIndustry#AIDACruises#CruiseShipping#MaritimeNews#CruiseMarket
🚢Круизное судно «Le Jacques Cartier» открывает новый плавучий причал в порту Брум.
Французское экспедиционное круизное судно «Le Jacques Cartier» (оператор — PONANT) стало первым круизным лайнером, пришвартовавшимся к новому плавучему причалу в порту Брум (Западная Австралия).
Инфраструктура, реализованная Kimberley Marine Support Base (KMSB), решает ключевую проблему региона — экстремальные приливные колебания, достигающие нескольких метров за цикл.
Плавплатформа соединена с берегом эстакадой и адаптируется к уровню воды, обеспечивая безопасный доступ вне зависимости от фазы прилива.
✔️ Повышена операционная предсказуемость заходов круизных судов.
✔️ Расширены параметры по размеру и типу принимаемых лайнеров.
✔️ Созданы предпосылки для статуса порта первого захода (homeport/first entry point).
Для круизного сегмента северной Австралии это снижает погодные и приливные риски, а также усиливает позиции Брума как точки начала/завершения круизных маршрутов при соответствующем таможенном оформлении.
📌PONANT основана в 1988 году во Франции группой офицеров торгового флота. Компания специализируется на экспедиционных круизах премиум-класса. С 2015 года входит в структуру французской инвестиционной группы Artemis Group, контролируемой семьёй Пино (Pinault).
#CruiseShipping#PortInfrastructure#Australia#ExpeditionCruise#MaritimeDevelopment
🚢Costa Cruises отменяет ближневосточные круизы на зиму 2026–2027.
Итальянская круизная компания Costa Cruises объявила об отмене всех рейсов в ОАЭ и страны Ближнего Востока в зимнем сезоне 2026–2027 годов.
Решение связано с сохраняющейся геополитической нестабильностью и рисками для круизных операций в регионе.
Вместо этого компания перераспределяет флот на более стабильные направления. Лайнер «Costa Smeralda» будет выполнять 7-дневные круизы между Канарскими островами и Мадейрой, что станет первым зимним сезоном судна в этом регионе.
Одновременно «Costa Pacifica», ранее запланированный для Канарских маршрутов, после ремонта на верфи будет переведён в Западное Средиземноморье, где вместе с лайнером «Costa Toscana» предложит новые 8-дневные маршруты и более длительные круизы по Южной Европе и Северной Африке.
Компания отмечает, что изменения направлены на повышение стабильности расписания и снижение операционных рисков.
Пассажирам отменённых рейсов предложена перебронирование на альтернативные круизы с бортовым кредитом €200 на каюту.
📌Costa Cruises — итальянская круизная компания, основанная в 1854 году в Генуе. Сегодня бренд входит в крупнейшую мировую круизную группу Carnival Corporation & plc, которая является владельцем компании.
#CruiseIndustry#CostaCruises#CruiseShipping#MediterraneanCruise#MaritimeTourism
🚢Круизный парусный лайнер «Orient Express Corinthian» установил рекорд на ходовых испытаниях.
Новый парусный круизный лайнер «Orient Express Corinthian», строящийся на французской верфи Chantiers de l’Atlantique, успешно завершил испытания силовой установки и показал рекордные характеристики для судна такого размера.
Во время испытаний судно развило 12 узлов исключительно под парусами при скорости ветра около 20 узлов, что стало новым достижением для парусного судна подобного класса. Максимальная проектная скорость лайнера составляет до 17 узлов.
Судно водоизмещением 25 200 GT и длиной 220 метров рассчитано на 110 пассажиров в 54 люксах.
Лайнер оснащён инновационной системой Solid Sail — тремя углеродными мачтами высотой около 69 метров и общей площадью парусов 4 500 м². Дополнительно судно оборудовано главным двигателем, работающим на СПГ, что позволяет снизить выбросы и повысить экологическую эффективность.
Проект реализуется для бренда Orient Express, принадлежащего группе Accor, которая выходит на рынок ультра-люксовых круизов.
Передача судна ожидается в мае 2026 года, после чего лайнер начнёт первый сезон на Средиземном море.
📌Chantiers de l’Atlantique — одна из крупнейших судостроительных верфей Европы, основана в 1861 году в Сен-Назере (Франция). Основным владельцем является французское государство через холдинг Agence des Participations de l’État, а миноритарным акционером выступает итальянская судостроительная группа Fincantieri.
#CruiseShipping#SailingCruise#OrientExpress#ChantiersAtlantique#MaritimeInnovation