Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🚢Ставки на зерновые перевозки из Чёрного моря продолжают рост.
Фрахтовые ставки на перевозку зерна из Чёрного моря демонстрируют устойчивый рост по всем сегментам.
Для малого тоннажа (коустеров) - ставки достигают $30–32/т в Мармаре и до $55–57/т в Испании, тогда как крупнотоннажные балкеры типоразмера Panamax на маршруте в Южный Китай фиксируются на уровне $49–51/т.
В сегменте балкеров типоразмера Handysize - ставки на перевозку в Восточное Средиземноморье находятся в диапазоне $26–28/т, а для подтипа Small Handysize: $28–30/т, что отражает общий рост затрат.
С операционной точки зрения, ключевым драйвером остаётся рост цен на бункер на фоне конфликта на Ближнем Востоке, что увеличивает себестоимость рейсов и усложняет согласование сделок между судовладельцами и фрахтователями.
Для рынка это означает усиление волатильности и расширение спредов между ожиданиями сторон, при сохранении восходящего тренда ставок.
📌Источник: рынок/брокерская оценка (Black Sea grain market) — данные основаны на оценках участников рынка и фрахтовых брокеров, формирующих фрахтовые ориентиры в регионе.
#DryBulk#Grains#BlackSea#Freight#Shipping
🚢Рекорд морской торговли зерном в 2025 году усиливает фрахт в 2026-м.
По данным Ursa Shipbrokers, объём морских перевозок сельхозгрузов в 2025 году достиг 716,5 млн тонн (+1% г/г), установив новый исторический максимум.
Рост во втором полугодии (+7% г/г) компенсировал слабое начало года и поддержал ставки, особенно в сегментах Supramax и Panamax.
Импульс сохраняется в 2026 году: январские отгрузки составили 57,1 млн тонн (+8% г/г), а в первые шесть недель года: +15% г/г (оценка BIMCO).
Ключевые драйверы — рекордные урожаи в Южном полушарии и рост экспорта сои (+30%) и пшеницы (+17%). Производство сои в Бразилии прогнозируется на уровне 180 млн тонн (42% мирового объёма).
Удлинение плеча перевозок из Южной Америки увеличило тонно-мили на 17% г/г, что особенно поддержало типоразмер Panamax.
Индекс Baltic Exchange балкеров типоразмера Panamax вырос в среднем на 69% г/г в начале года; зерновые формируют около трети спроса сегмента в тонно-милях. Типоразмер Supramax - также прибавил по объёмам (+20% г/г).
Прогноз BIMCO на 2026 год — рост мировых поставок зерна на 5–6%, при условии благоприятных урожаев в Северном полушарии.
📌Ursa Shipbrokers — частная британская брокерская компания, основана в 2010 году, специализируется на аналитике и S&P dry bulk. Контролируется партнёрами-основателями.
#drybulk#grains#Panamax#freightrates#shippingmarket
В прошлый четверг, 25 июня Международный совет по зерну (МСЗ) опубликовал очередной ежемесячный обзор рынка зерновых. Согласно документу, несмотря на негативное влияние пандемии COVID-19, производство зерновых по итогам 2019/2020 сельскохозяйственного года покажет отличные результаты: прогнозируется рост в 2% по сравнению с прошлым годом.
В результате его совокупный объем достигнет 2 175 млн т (против 2 137 млн т в 2018/2019 с.-х. г.) преимущественно за счет роста производства пшеницы (до 762 млн т по сравнению с 732 млн т в 2018/2019 с.-х г.) на фоне падения производства кукурузы до 1 117 млн т в 2019/2020 с.-х. г. (-12 млн т по сравнению с 2018/2019 с.-х. г.).
При этом рост производства сопровождается ростом глобального потребления, которое по итогам настоящего с.-х. г. должно составить 2181 млн т (2166 млн т. в прошлом с.-х.г.), что приведет к продолжению двухлетнего тренда сокращения запасов.
Интересно, что эксперты Совета демонстрируют уверенность в том, что 2020/2021 с.-х. г. станет лучшим с точки зрения производства зерновых за всю историю наблюдений, достигнув 2237 млн т, благодаря рекордным урожаям пшеницы и кукурузы. С учетом того, что предполагаемый рост потребления будет менее значительным (до 2218 млн т), запасы зерновых впервые за три года вырастут.
Производство соевых бобов и риса по итогам 2020/2021 с.-х. г. также должны продемонстрировать рост (на фоне определенного снижения производства в этом с.-х.г. по сравнению с 2018/2019 с.-х. г.).
Приведенные данные позволяют говорить о том, что пандемия COVID-19 практически не должна сказаться на физических объемах производства важнейших продуктов питания. Вместе с тем падение падение доходов многих развивающихся стран и стран в особой ситуации (наименее развитые, не имеющие выхода к морю и малые островные государства) может даже на фоне роста производства и ожидаемого снижения цен привести к нехватке продовольствия и кризисным явлениям. Дополнительную "негативную" лепту могут внести разрывы в цепочках поставок в случае возможного ухудшения эпидемиологической ситуации и мер по ограничению транспортного сообщения.
#internationalgrainscouncil#grains#wheat#commodities#internationalfoodsecurity#зерно#международныйсоветпозерну#международнаяпродовольственнаябезопасность#сырьевыетовары#международнаяторговля
Подробнее о докладе на странице Центра многостороннего сотрудничества и евразийской интеграции РСПП: http://рспп.рф/events/news/msz-proizvodstvo-zernovykh-v-2020-2021-s-kh-g-pobet-vse-rekordy-5ef71bf511056/