Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Ярмарка на Троещине и драка из-за проезда к дому по тротуару
Видео: https://youtu.be/kf7rl6gC8MQ
На горячую линию 102 поступил вызов «Перекресток Закревского и Маяковского, на территории ярмарки большая драка, с применением оружия». Меньше чем за 5 минут на месте уже два экипажа патрульной полиции.
Выясняется, что мужчина двигался по тротуару на автомобиле #Toyota. Таким образом он объезжал ярмарку, чтобы попасть к себе домой. Другому мужчине, который шёл по тротуару, показалось, что Toyota чуть не сбил дедушку и перегородил автомобилю дорогу. Началась словесная перепалка, после чего пешеход кинул крупой в водителя и оторвал ему задний дворник. Между двумя мужчинами началась драка. Когда их разборонили, водитель Toyota достал пистолет (есть все документы) и заслал патрон в патронник, в ответ пешеход начал размахивать палкой. К счастью, обошлось без стрельбы.
От медицинской помощи оба участника конфликта отказались.
На месте работали патрули полиции и следственно-операторная группа.
Проспект Правди, 85. П’яний чоловік, років 60, після «зустрічі» із другом, йшов додому. На його шляху трапилась дорога. Ну, він просто взяв і почав переходити (не на переході). А тут #Toyota, водій і пішохід не помітили один одного. І, хоча, водій намагався уникнути зіткнення - не вдалося.
Пішоход навіть хотів втекти, але побачив швидку і вирішив поїхати в лікарню.
Вот это вам точно понравится - HIGHLANDER 2021 гв, пробег всего 37 тыс. км.
Один владелец - юр. лицо, возможен возврат НДС. Идеальное техническое состояние, защита от поломок до сентября 2028 г.
3,5 л бензин, 249 лс, полный привод, 3 ряда сидений, 7 мест, датчики света, дождя и давления в шинах, обогрев лобового стекла, камера заднего вида, салон - кожа.
Цена - 5,499 млн руб.
Менеджер Кирилл @KirStar96
#toyota
Культовая машина для понимающих. Лучшее что есть в комфорт+ классе. Toyota Camry. Машина без изъяна.
Такая сейчас продается в Major Expert. 2021 год выпуска, пробег всего 123 тыс км - для надежного бензинового двигателя 2,5 л на 200 лс это ничто. Передний привод, 8-и ступенчатая АКПП. Без дефектов по технике.
Машина была куплена в Major Auto, абсолютно прозрачная история. Программа защиты от поломок действует до октября 2028 года.
Цена всего 2,970 млн руб.
По всем вопросам - Кирилл @KirStar96
#toyota
Автомобиль года в Японии - 2019-2020 года. Лучший "маленький SUV" в США 2019-2020 года. 5 звезд Euro NCAP.
Toyota RAV4 - первый компактный городской SUV, открывший огромный класс автомобилей, которые хотят быть на него похожими. Но зачем брать копии, если есть оригинал.
В Major Expert на выбор 27 машин на любой вкус и кошелек. От машины 2012 года с пробегом 224 тыс км за 1,26 млн руб, до машины 2024 года с пробегом 36 тыс км за 4,3 млн руб (на видео)
Подробности у Кирилла @KirStar96
#toyota
Toyota планирует увеличить жизненный цикл своих флагманских моделей. До 2000 года поколения менялись каждые 4-5 лет, потом каждые 7 лет, теперь ориентир — 9 лет. В промежутках будет меняться только программное обеспечение. Это кардинально отличается от "китайского подхода", где модель обновляется каждые год-два.
Дилеры недовольны, они считают что продаваться будет хуже. Потребители наверное будут спокойнее. Не будет смысла откладывать покупку в ожидании обновления.
Поддерживаю — 👍
Не поддерживаю — 👎
#toyota
Toyota Hilux — надежный и простой. И любимый. Кажется в нем вообще ничего не может сломаться никогда.
Major Expert — на выбор 4 варианта. Дизели 2,4-2,8 литра, АКПП или МКПП для ценителей. Полный привод.
Года выпуска — 2016-2021, пробеги 38-152 тыс км, для Hilux это ничто. Цены 3,51-4,53 млн руб.
Подробности: +7 (495) 089-05-39
#toyota
По американской статистике средний автомобиль до «смерти от старости» проезжает 250-300 тыс км. Издание iSeeCars ведет рейтинг вероятности того, что машина доедет до 400 тыс км пробега. Те что доезжают — по настоящему надежные.
Самые неубиваемые в штатах - Toyota: Sequoia, вероятность достижения отметки 400 тыс - 39%, 4Runner (33%) и Highlander (31%). Потом по списку Lexus и Honda. Средняя вероятность по американскому рынку - 4,8%.
Европейский автопром не попал даже во вторую десятку рейтинга. Он требует ухода, а в штатах к машинам относятся наплевательски.
#toyota
Toyota производила FJ CRUISER с 2006 по 2022 год, но машина до сих пор востребована на вторичке в силу своего культового статуса. Ретро дизайн с отсылкой к Land Cruiser FJ40 из 60-х сделал из машины идола.
У машины был 4-х литровый бензиновый V6, водо- и грязе-устойчивый интерьер и двухцветный кузов.
Сейчас Toyota анонсировала возрождение. Оно похоже на все китайские внедорожники-кубики и у него 2,7 л. мотор на 163 л.с. Кажется что это уже не то.
Все равно супер — 👍
Не супер — 👎
#toyota
Toyota построит завод по производству электромобилей в Шанхае
Завод, расположенный в районе Цзиньшань на юго-западе Шанхая, будет разрабатывать новый электромобиль под брендом Lexus. Производство планируется запустить в 2027 году.
Toyota станет вторым мировым автопроизводителем после Tesla, который построит собственный автономный завод в Китае.
Первоначальная производственная мощность составит около 100 тыс. автомобилей в год. Ожидается, что будет создано около 1 тыс. рабочих мест.
К 2030 году под брендом Lexus планируется продать 1 млн электромобилей, а к 2035-му выпускать только электромобили.
#toyota
🚙 Toyota unveils the “mini” Land Cruiser
🔎 The new model is a compact SUV with a retro-futuristic design, reminiscent of the Land Cruiser Prado. The cars share similar shapes and details, but the front end of the smaller version can differ — it offers round headlights or C-shaped LED lights.
🐎 Under the hood: a 2.7-liter gasoline engine producing 163 hp, paired with a classic automatic transmission and all-wheel drive.
#Toyota@Car_News
🚙 Toyota представила «мини» Land Cruiser
🔎 Новая модель — компактный внедорожник в стиле ретро-футуризма, напоминающий Land Cruiser Prado. У машин схожие формы и детали, но передняя часть «младшей» версии может отличаться — круглые фары или С-образные LED-оптики.
🐎 Под капотом — 2,7-литровый бензиновый двигатель мощностью 163 л.с., классический «автомат» и полный привод.
#Toyota@avtoNovosti