Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#happier
...то есть, из-за того, что мне неловко писать на "сторонние темы", моё мимолётное увлечение пиратами пройдёт мимо моего блога? И в будущем, если я вдруг про него вспомню, то не найду ничего, что оставила бы себе же на память?
Снова клубок тем, но в первую очередь – "о чём писать можно, а о чём нельзя". В блоге я в основном думаю вслух, и думать пытаюсь о чём-то субъективно важном: пока пишу, часто переосмысляю свои же убеждения.
А потом:
"Ого, Wiktionary говорит, что греческое καραμέλα – это заимствованное итальянское caramella! ...стойте, а ведь Греция и Италия же сравнительно близко друг к другу..."
В случае же с пиратами получилось так, что желание безопасно и малозатратно пробовать новое совпало с более близким знакомством с Heroes of Might and Magic 3: Horn of the Abyss, где есть пираты, причём довольно крутые. Играть я устала через три дня (я играю в Героев уже ~17 лет, насколько помню, такое почти кому угодно надоест), но теперь то, что я делаю, я делаю под вариации морских песен. Например.
Тут есть и какое-то новое практическое знание, которым можно поделиться, но, кажется, формат "дельта на дельте" меня не только утомил, но и запер в узких рамках. Мне кажется, что нужно писать о чём-то, что читатели смогут использовать сами; в итоге мне самой тесно, потому что жизнь зачастую далеко не только про полезность.
С другой стороны, почему я говорю, что увлечение пиратами мимолётно: ему всего пара дней, и я специально не углубляюсь в тему – это всё действительно далеко от того, чем я обычно занимаюсь, и хотя мне интересно, я не хотела бы обменивать свои немногие ресурсы именно на эту тему среди всех остальных. В то же время музыка навевает дух приключений, который в реальной жизни у меня бывает очень редко – и мне действительно не хватает вдохновляющих штук.
И, как обычно, я не очень согласна заметать под ковёр вещи, от которых мои глаза загораются. Особенно если не соглашаюсь я сама с собой.
#happier
Сижу холодными зимними вечерами и рассказываю про Героев Меча и Магии, или про тропы, или про тропы в Героях Меча и Магии... :)
Мало пишу об этом, но в последнее время (не больше месяца-двух) я порой внезапно обнаруживаю у себя экспертность, которую ценю и в других.
Экспертность ощущается через "ого, оказывается, я знаю намного больше, чем думала". Как обычно, это не значит, что все остальные люди проживают это так же или что я всегда проживаю это именно так.
Да, скорее всего, я не буду выигрывать онлайн-турниры и не знаю и десятой части 31773 тропов на ТВТропах. Тем не менее я играла в Героев так много, что теперь пятая часть надоедает мне уже на главном меню, а на ТВТропах было проведено немало вечеров.
Но обычно я не ощущаю прогресс в таких вещах... Пока не начинаю о нём говорить кому-то ещё. Вдруг оказывается, что я помню намного больше деталей, чем думаю.
Мотивирует больше изучать темы, которые, кхм, ассоциируются у меня с работой; хочется больше положительного подкрепления такого рода. "Да, я знаю".
#happier
...так вот, теория категорий.
Думаю, весь дальнейший пост будет звучать весьма наивно/расплывчато из-за того, что я не очень разбираюсь в том, о чём говорю. Щито поделать.
Слова "я изучаю теорию категорий" из моих уст могут звучать довольно кринжово. Я, человек, в апреле заново проходивший логарифмы к ЕГЭ, вдруг интересуюсь одной из самых абстрактных областей в математике...
...но ведь потому и интересно: я могу не очень хорошо считать, но я люблю находить паттерны и смотреть на происходящее с пост-пост-мета-мета позиции. "Пусть сначала сломается" (с) – не хочу откидывать интересное только потому, что люди с моим уровнем обычно его не понимают; а если не пойму сама, то всегда смогу задать себе вопрос "почему?" и пойти гуглить точечно.
Поиск паттернов, в свою очередь, вызывает у меня мысли о дискурс-анализе. Я не знаю, определились ли исследователи с тем, что такое "дискурс"; я его интерпретирую скорее как совокупность высказываний различных форм и содержания, а дальше, кхм, становится сложнее.
Для меня одна из самых захватывающих штук в дискурс-анализе – это попытка обнаружить то, о чём автор не говорит явно. Почему люди пишут так, как пишут? Потому что так принято, потому что они не имеют возможности сказать прямо? И ведь по сей день некоторые древние тексты переведены, но до сих пор не расшифрованы до конца – нужный культурный контекст уже утерян, а метафоры и прочее остались.
А потом я начинаю поглядывать на Eliciting Latent Knowledge – одну из открытых проблем AI Safety. На суперрукомахательном уровне – "допустим, ИИ владеет некой информацией, которую он не сообщает людям в ответ на запрос; как понять, что ИИ недоговаривает/лжёт?".
Я не знаю, насколько социальные и прочие факторы влияют на обучение ИИ, но сама эта задача – "вытащить наружу некое неявное знание" – всё ещё звучит интересно, хотя я ожидаю, что методы дискурс-анализа тут вряд ли будут хорошо работать.
И, что занятно: узкие, конкретные исследовательские вопросы и области могут сильно различаться, но общие, широкие вопросы и закрываемые ими потребности могут быть одинаковыми.
И, немного в сторону: даже если выяснится, что все эти области выглядят не так, как я думаю сейчас, когда я знаю о них лишь понаслышке, – ничего страшного. Я могу понять, что это не моё, и пойти закрывать общие интересы другими способами; могу полюбить эти сферы за что-то ещё. Мои новичковые, наивные представления о том, как работает мир – это не те убеждения, за которые я хочу держаться дольше необходимого.
#happier
Тем временем коллеги из Сербии открыли новый AI Safety коворкинг в Белграде. 🎉
Я сама вряд ли там буду в обозримом будущем, но если вдруг кто-нибудь искал такое AIS/EA/LW-сообщество — вот оно! :з
Вчера хотела написать ещё пост про штуки, которые меня радуют, но "я и так уже написала две стены текста и третью репостнула — да, укладываюсь в свой же лимит 5 постов/день, но куда ещё одну такую же".
Но! В последнее время потихоньку становится лучше эмоционально, и хочется хотя бы немного сместить акценты.
Проблемы из жизни не исчезают — но я постепенно становлюсь радостнее.
#happier
#happier
...я писала пост, который начинался как-то так и должен был иметь какой-то такой посыл:
Недавно я пережила кризис веры и глубокий провал в мотивации, поэтому уже неделю-две как читаю и смотрю в первую очередь то, что интересно именно мне — даже если оно напрямую не связано с рациональностью, эффективным альтруизмом или AI Safety.
Я считаю, что знания из других областей всё равно полезны, даже если это не то, чем я занимаюсь на постоянной основе — и любопытство не враг мне.
...поэтому теория категорий.
Почему вы сейчас читаете (если, конечно, вы обновили тг до последней версии) именно этот пост, а не тот? Потому что я ставлю ссылки на источники, и в этом случае источник — эссе Юдковского "Кризис веры"...
...которое, оказывается, я не читала дальше первого абзаца и которое вообще не про то, что я хотела написать.
Но я прочитала — и это эссе, а потом ещё одно (надо ставить ссылки на источники! ой, это короткое и выглядит интересно, пусть будет ещё одно).
Здесь можно было бы выйти на что-нибудь поучительное вроде "Чекайте источники" -> "Не ограничивайтесь чем-то одним, если вам любопытны и другие вещи", но на самом деле мне хотелось поделиться радостью.
Увы, в последнее время я не очень много радуюсь и ещё меньше об этом пишу — но даже в лучшие времена не так уж много вещей заставляет меня встать со стула и пойти танцевать.
Всё-таки источник не виноват в том, что я долго читала именно его — он не теряет своей полезности от этого.
Но, зная, что я не хочу (а, быть может, и не могу) поглощать так много материала за один присест, я разрешаю себе свободно плавать и изучать разное — зная, впрочем, что у меня есть Цель, ради которой я вплетаю отдельные ниточки в цельное полотно своей картины мира.
И иногда я возвращаюсь — со свежим взглядом, с новыми знаниями и опытом — и обнаруживаю, что мне всё ещё интересно. И что мотивацией тоже можно управлять.
Happier - Olivia Rodrigo ('60s Girl Group Style) ft. Allison Young
2022-03-04 by PostmodernJukebox
#OliviaRodrigo#Happier#OliviaRodrigocover#Happiercover#OliviaRodrigoHappier#HappierOliviaRodrigo#OliviaRodrigoHappiercover
#YouTube#liked