Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Adresare către cetățenii indeciși!
Dragi prieteni, știu că sunt foarte mulți cetățeni indeciși – peste 26%.
Eu nu voi cerși voturi, nu o să vă povestesc istorii frumoase, nu voi încerca să vă spun ceva care să vă placă pentru a ne vota.
Eu doar vreau să vă rog să vă gândiți și să ieșiți la vot! Dacă dumneavoastră veți rămâne indeciși până după alegeri, înseamnă că va fi târziu.
Imediat după alegeri vor ieși la iveală scheme noi despre gaz!
Sau vreți să așteptați să mai găsim zeci de tone de păcură îngropate?!
Sau vreți să pierdem accesul la Dunăre? Este o informație strict secretă pe care am primit-o cu câteva ore în urmă.
Sau veți decide atunci când, imediat după parlamentare, până la validarea mandatelor, Vladimir Plahotniuc va fi liber?!
Sau veți decide când, imediat după parlamentare, urmare a unor înțelegeri, principalul suspect în “dosarul Kuliok” va fi achitat?!
Sau poate veți decide atunci când, după alegeri, veți afla că una dintre principalele persoane din conducerea statului și-a cumpărat deja casă în secret la Londra și se pregătește pentru evacuare?!
Eu cred că atunci va fi prea târziu!
Haideți să luăm împreună decizia corectă pe 28 septembrie! E TIMPUL SĂ FIM ÎMPREUNĂ! #PartidulNostru#DoarPentruMoldova
Renato Usatîi - unicul lider politic care a răspuns la întrebările jurnaliștilor în trei limbi – în limba de stat, în rusă și engleză
Președintele Partidului Nostru, Renato Usatîi, s-a remarcat astăzi ca unicul lider politic care a răspuns întrebărilor jurnaliștilor în trei limbi – în limba de stat, în rusă și engleză – la ieșirea din secția de votare. Continuare...
---
Ренато Усатый — единственный политический лидер, который ответил на вопросы журналистов на трёх языках — на государственном, русском и английском
Председатель Нашей Партии Ренато Усатый сегодня был единственным политическим лидером, который после выхода с избирательного участка ответил на вопросы журналистов на трёх языках — на государственном, русском и английском. Подробности по ссылке...
#PartidulNostru#НашаПартия#DoarPentruMoldova
Igor Pohila, Partidul Nostru: Justiția trebuie înfăptuită în sala de judecată, nu în birourile politicienilor!
Detalii..
--
Игорь Похила, Наша Партия: Справедливость должна вершиться в зале суда, а не в кабинетах политиков!
Подробности - по ссылке...
#DOARPENTRUMOLDOVA
#partidulnostru#нашапартия
Duminică, 7 septembrie
🕙10:00 – satul Glinjeni, la intrare în Piață
🕚11:00 – satul Catranîc, în fața Casei de Cultură
🕐13:00 – satul Musteața, în fața Casei de Cultură
🕝14:15 – satul Năvîrneț, Parcul Central
🕓16:00 – or. Fălești, Parcul Central
Stimați locuitori ai raionului și orașului Fălești și ai satelor Glinjeni, Catranîc, Musteața, Năvîrneț, vă invit la o discuție deschisă, unde vom prezenta soluțiile Partidului Nostru pentru dezvoltarea Moldovei – acum, nu peste ani!
E TIMPUL SĂ FIM ÎMPREUNĂ!
#DOARPENTRUMOLDOVA
#partidulnostru#нашапартия
Sâmbătă, 6 septembrie
🕛12:00 – municipiul Ungheni, Parcul „Micul Cluj”
🕐14:15 – satul Petrești, Casa de Cultură
🕝15:30 – satul Costuleni, Casa de Cultură
🕓16:45 – satul Pîrlița, Casa de Cultură
🕔17:40 – orășelul Cornești, Casa de Cultură
Stimați locuitori ai raionului Ungheni, ai satelor Petrești, Costuleni, Pîrlița și ai orășelului Cornești, vă invit la o discuție deschisă, unde vom prezenta soluțiile Partidului Nostru pentru dezvoltarea Moldovei – acum, nu peste ani!
E TIMPUL SĂ FIM ÎMPREUNĂ!
#DOARPENTRUMOLDOVA
#partidulnostru#нашапартия
Vineri, 5 septembrie, ora 18:30
Orașul Sîngerei, Piața Independenței (în fața Casei de Cultură)
Stimați locuitori ai raionului Sîngerei, Vă invit la o discuție deschisă, unde vom prezenta soluțiile Partidului Nostru pentru dezvoltarea Moldovei – acum, nu peste ani!
E TIMPUL SĂ FIM ÎMPREUNĂ!
#DOARPENTRUMOLDOVA
#partidulnostru#нашапартия
Joi, 4 septembrie, 18:30, orașul Șoldănești, Scuarul Tinerilor, str. Păcii.
Stimați locuitori ai raionului Șoldănești, vă invit la o discuție deschisă, unde vom prezenta soluțiile Partidului Nostru pentru dezvoltarea Moldovei – acum, nu peste ani!
E TIMPUL SĂ FIM ÎMPREUNĂ!
#DOARPENTRUMOLDOVA
#partidulnostru#нашапартия
Ренато Усатый ответил на обращение Ирины Влах: Наша Партия не будет создавать альянс ни с PAS, ни с блоком «Чужая свадьба». Наш единственный союзник – граждане Молдовы!
«В отличие от вас, Наша Партия давно и четко сказала, что с PAS не будет делать коалиции – с дураками и бездельниками коалиции делать не будем. Но вам понадобилось это представление. Не вы решаете – будете ли вы создавать коалицию или нет – за вас решают другие. С большинством из вас говорить не о чем – нужно решать с вашими хозяевами. Это не пакт, это чужая свадьба, и быть свидетелем на ней я не собираюсь», - подчеркнул Ренато Усатый.
Он заявил, что единственный союз, который подпишет он и Наша Партия, это союз с народом. Подробнее – по ссылке...
---
Renato Usatîi a răspuns la solicitarea Irinei Vlah: Partidul Nostru nu face alianță nici cu PAS, nici cu blocul «Чужая свадьба». Unicul aliat al Partidului Nostru este cetățeanul Republicii Moldova!
«Spre deosebire de voi, Partidul Nostru a spus demult și clar: nu va face coaliție cu PAS – cu proști și incompetenții nu facem coaliții. Nici cu așa-numiții pro-europeni, nici cu «russkii mir».Dar vouă v-a trebuit acest spectacol. Nu voi decideți dacă faceți sau nu o coaliție – pentru voi decid alții. Cu majoritatea dintre voi nu are rost să vorbesc – trebuie de discutat cu stăpânii voștri. Acesta nu e un pact, e «Чужая свадьба», iar eu nu vreau să fiu lăturaș la această nuntă», a subliniat Renato Usatîi.
El a precizat că singura alianță pe care o va semna el și Partidul Nostru este alianța cu poporul. Detalii...
#PartidulNostru#НашаПартия#DoarPentruMoldova
Miercuri, 3 septembrie, 18:30, orașul Nisporeni, Parcul Central „La Moară”.
Stimați locuitori ai raionului Nisporeni, vă invit la o discuție deschisă, unde vom prezenta soluțiile Partidului Nostru pentru dezvoltarea Moldovei – acum, nu peste ani!
E TIMPUL SĂ FIM ÎMPREUNĂ!
#DOARPENTRUMOLDOVA
#partidulnostru#нашапартия
🔷🔷🔷🔷🔷Resetarea Partidului Nostru continuă: echipa din Ocnița se extinde și își consolidează structura!
Renato Usatîi s-a întâlnit, duminică, cu echipa Partidului Nostru din Ocnița pentru a discuta despre consolidarea structurii organizatorice a partidului în teritoriu, despre pregătirea pentru alegerile parlamentare și despre pașii concreți pentru dezvoltarea țării. Liderul Partidului Nostru le-a mulțumit membrilor locali – atât celor care sunt alături de formațiune de la creare, cât și celor care s-au alăturat pe parcurs.
Pentru noi toți sunt egali, și eu mulțumesc tuturor că sunteți alături de noi. Pentru majoritatea oamenilor din Republica Moldova, Partidul Nostru este ultima speranță. Iar resetarea Partidului Nostru înseamnă reconstrucția unei forțe curate, care nu a fost niciodată la guvernare și care azi este unica alternativă reală.
Detalii...
---
Перезагрузка Нашей Партии продолжается: команда в Окнице расширяется и укрепляет свою структуру!
В воскресенье Ренато Усатый встретился с командой Нашей Партии из Окницы, чтобы обсудить вопросы консолидации организационной структуры партии на местах, подготовку к парламентским выборам и конкретные шаги по развитию страны. Лидер Нашей Партии поблагодарил однопартийцев – как тех, кто в партии с cамого начала, так и тех, кто присоединился к ней позже.
Для нас все равны, и я благодарю всех за то, что вы с нами. Для большинства жителей Республики Молдова Наша Партия – последняя надежда. А перезагрузка Нашей Партии означает воссоздание чистой силы, которая никогда не была у власти и которая сегодня является единственной реальной альтернативой.
or. Ocnița, str. 50 de Ani ai Biruinței, nr. 5A; Tel.: 0 (76) 770 780
#PartidulNostru#НашаПартия#DoarPentruMoldova
Подробнее...
Primarul orașului Cantemir din partea Partidului Nostru, Roman Ciubaciuc: „În oraș vor începe în curând lucrările de reparație a mai multor străzi”
Primarul orașului Cantemir, Roman Ciubaciuc, ales din partea Partidului Nostru, a anunțat despre lansarea unui proiect de reparație a mai multor străzi din localitate. Primăria a lansat deja licitația pentru selectarea antreprenorilor. Lucrările sunt finanțate din bugetul de stat și bugetul local. Detalii…
---
Примар Кантемира от Нашей Партии Роман Чубачук: В городе скоро начнутся работы по ремонту ряда улиц
Избранный от Нашей Партии примар города Кантемир Роман Чубачук рассказал о запуске проекта по ремонту ряда городских транспортных артерий. Примария уже объявила тендер на поиск подрядчиков. Работы финансируются из государственного бюджета при долевом участии местных властей. Подробности по ссылке…
#PartidulNostru#НашаПартия#DoarPentruMoldova