Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#yangiliklar#TomCruise
Internetda Tom Kruz va Heyli Atvell haqida yangi xabarlar tarqaldi
The Sun gazetasining yozishicha, Londonda "Uddalab bo'lmas topshiriq 7" filmi suratga olish ishlari orasidagi tanaffus paytida yulduzli juftlik yashirincha uchrashib turishishadi va Atvell allaqachon Kruzning uyiga bir necha marta tashrif buyurishga ham ulgurgan.
Vaqt o'tadi, lekin Tom Kruz o'z filmlari orqali ayollarni tanlash qobiliyatini yo'qotmaydi!
Manbaa:@marvel_fanclub
@TOM_KRUZ_OFFICIAL
⠀
😎Том Круз на съемках фильма «Лучший стрелок», 1986
⠀
В этом году актеру исполнилось 63 года:
💬 «Я не собираюсь замедлять то самое движение вперед, без которого просто не представляю свою жизнь. Мой возраст не вызывает у меня необычных эмоций — очередной день рождения и не более того. Чувствую себя великолепно и собираюсь еще долго сниматься в приключенческих картинах, в которых смогу самостоятельно выполнять разные трюки!»
⠀
#ТомКруз#TomCruise
17 декабря 2024 год – Легенда Голливуда решил выйти из затишья самым фееричным способом!
Ведь сегодня, в этот вторник, Том Круз был удостоен награды от ВМС США «За выдающиеся заслуги перед обществом» от министра ВМС США Карлоса Дель Торо во время церемонии в студии «LongCross Studios» в Чертси, Великобритания.
Награда вручается ВМС гражданским лицам, совершившим ценные поступки или проявившим героизм, или продемонстрировавшим исключительную службу на службе ВМС в течение длительного периода. Это самая престижная награда ВМС США, присуждаемая гражданским лицам.
#events | #TomCruise ✗ #ТомКруз
Администратор решил потрудиться и сделать экспресс-перевод вчерашней речи Тома Круза во время вручения ему награды от ВМС США «За выдающиеся заслуги перед обществом». Это самая престижная награда ВМС США, присуждаемая гражданским лицам.
#translation | #TomCruise ✗ #ТомКруз
🪂🔥 Tom Cruise sets fire to the sky in South Africa — literally!
In 2023, the Mission: Impossible star broke a Guinness World Record for performing 16 consecutive parachute jumps — with a twist:
his main chute was on fire!🔥
Where did this madness take place?
📍South Africa’s Drakensberg mountains.
Cruise jumped from a helicopter at 7,500 ft (≈2,300 m), lit his parachute on fire mid-air, then safely deployed a backup chute — 16 times in a row. 😳
Oh, and there’s more.
He also did a wing-walking stunt on a biplane, and at one point couldn’t get back inside — because he was too exhausted.
🎬 All of this for Mission: Impossible – The Final Reckoning (Part 2). No green screens. No stunt doubles. Just Cruise being... Cruise.
#TomCruise#MissionImpossible#StuntLegend#SouthAfrica#ParachuteJump#Drakensberg#GuinnessWorldRecord
— Ты считаешь, что человек может изменить свою судьбу?
— Я считаю, что человек делает то, что может. Пока ему не откроется его судьба.
#ВИДЕОТЕКА
#TheLastSamurai
#ПоследнийСамурай
#ТомКруз
#TomCruise
#KenWatanabe
#КэнВатанабэ
Однако у Скотта получился один из лучших фильмов о гонках всех времён. Да, где-то скомканный и сумбурный, но при этом невероятно мощный и драйвовый. С фирменным режиссерским стилем, с классным актерским ансамблем, а также великолепной музыкой Ханса Циммера (и гитарной партией Джеффа Бека). И с такой химией между Томом Крузом и Николь Кидман, что экран дымится даже сейчас — когда все страсти уже давным-давно улеглись, и мы все знаем, чем закончилась история одного из самых красивых голливудских браков 90-х.
Вот что бывает, когда за дело берутся по-настоящему талантливые люди, даже если и процесс у них идет с такими сложностями.
#ВИДЕОТЕКА
#DaysOfThunder
#ДниГрома
#TomCruise
#ТомКруз
#NicoleKidman
#НикольКидман
#RobertDuvall
#MichaelRooker
#CaryElwes
#TonyScott
«Самое страшное в моей жизни — это первое утро съемок всех моих фильмов. Это страх неудачи, потери лица и чувство вины из-за того, что все верят в тебя, и ты вдруг не справишься».
Сегодня исполнился 81 год со дня рождения легендарного режиссера Тони Скотта
#ВИДЕОТЕКА
#TonyScott
#TopGun
#DaysOfThunder
#TrueRomance
#EnemyOfTheState
#ManOnFire
#Domino
#TheTakingOfPelham123
#TomCruise
#WillSmith
#DenzelWashington
#JerryBruckheimer
#KeiraKnightley
«Я никогда не переживал, достанется ли мне золотая статуэтка, просто получал удовольствие от церемонии и предвкушал вечеринку, которая должна была за ней последовать».
Единственному и неповторимому Тому Крузу сегодня исполнилось 63 года.
#ВИДЕОТЕКА
#TomCruise
#ТомКруз
#RiskyBusiness
#TopGun
#RainMan
#TheFirm
#JerryMaguire
#MissionImpossibleII
#TheLastSamurai
#Collateral
#JackReacher
#EdgeOfTomorrow
#MissionImpossibleTheFinalReckoning