Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🚢США–Иран: риски для судоходства и последствия для чартеров.
Эскалация напряжённости между США и Ираном усиливает правовые и операционные риски для судоходства в Ормузском проливе — ключевом канале, через который проходит около 35% мировой морской торговли нефтью.
С февраля фиксируются сообщения о попытках частичного ограничения движения, задержаниях судов и инцидентах с GPS/AIS-глушением и спуфингом. Управление MARAD рекомендовало судам под флагом США избегать иранских территориальных вод и сохранять активные AIS-транспондеры. На фоне роста военного присутствия США в регионе (включая авианосную группу USS Abraham Lincoln) повышается вероятность инцидентов.
С точки зрения английского права, возможная блокада или атаки на суда могут активировать положения о «war risks» в чартер-партиях, включая стандартные оговорки BIMCO CONWARTIME и VOYWAR. Даже без формальной блокады угрозы и попытки принудительного захода в территориальные воды могут квалифицироваться как военный риск, что даёт сторонам определённые контрактные права и обязанности.
Дополнительный фактор — AIS/GPS-спуфинг. Хотя его квалификация как «war risk» менее однозначна, системные кибер- и радиоэлектронные вмешательства повышают навигационные риски, могут повлечь отклонение маршрутов и увеличение страховых премий.
Пролив остаётся открытым, однако совокупность геополитических, правовых и навигационных факторов усиливает неопределённость для фрахтователей, судовладельцев и страховщиков.
📌BIMCO (Baltic and International Maritime Council) — международная судоходная ассоциация, основанная в 1905 году, разрабатывает стандартизированные чартерные формы и оговорки, включая CONWARTIME и VOYWAR. Организация является независимой некоммерческой структурой, финансируемой членами.
#Hormuz#WarRisks#Charterparty#MaritimeLaw#ShippingRisk
Судья Батчер снова в эфире. После июньского мегапроцесса на $10+ миллиардов, где лизинговые компании воевали со страховщиками за «пропавшие» в России самолёты, суд выдал новый — «послевкусный» — акт: проценты, издержки, разрешения на апелляцию.
В сухом остатке — победители и побеждённые остались те же. AerCap, крупнейший лизингодатель в мире, удержал победу против военных рисковиков. Но радость слегка остыла: проценты только простые (не сложные), ставка — US Prime, а не выше. Судья вежливо намекнул, что никто толком не доказал, что AerCap берёт кредиты дешевле «самых надёжных клиентов американских банков», и spreadsheet, которым страховщики пытались снизить ставку, суду показался «слабым».
На костах — классическая мясорубка. AerCap получит 65% своих расходов с военных страховщиков, HFW (all risks) — 90%, а Chubb, хоть и пытался откреститься, попал на те же 65%. Платежи «на счёт» — 45–50%. В переводе с лондонского процессуального — «вам, господа, придётся заплатить, и прилично».
Апелляцию судья срезал без колебаний. 23 grounds от war risks, 5 от Chubb — всё в мусор. Цитируя Court of Appeal: «trial — это не генеральная репетиция, это премьерный и финальный показ». Суд устал от бесконечных попыток «переиграть по-новой», особенно после 33-дневного суда с экспертами, графиками и взаимными обвинениями.
Итог: авиастраховой рынок получил сигнал — суду хватит терпения ровно на один эпизод. Повторов не будет.
Все спорили о процентах, ставках, процентах на издержки — но главный процент здесь моральный. Все стороны, включая гигантов с десятками QC, выглядели как ученики, пересдающие один и тот же экзамен. В этом смысле “Russian Aircraft saga” — уже не дело, а эпопея о том, как международное право и страховые политики не рассчитаны на катастрофы геополитики.
#EnglishLawReport#CaseSpotlight#AerCap#Chubb#WarRisks#HighCourt#CommercialCourt#Judgment#SkepticalView