Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
中共在英統戰組識
還記得11月27日發生的倫敦唐人街港人遇襲事件嗎?
Post by IG @justitiahk
當日多個英國華人團體在倫敦唐人街舉辦反歧視集會,表面上是宣揚反歧視,實質為中共洗白。有手足亦在同日同地舉行「和你lunch」活動,不過集會結束後,十多名來自主辦方的人士,突然衝向數名在場手足拳打腳踢,甚至用金屬武器施襲,有人被打至頭破血流。
這些中共極權延伸的勢力是何人?我們且看看參與的集會團體:
民權法律中心 (Min Quan Legal Centre)
英國監察組 (The Monitoring Group)
英國福建華僑華人聯合總會(The Federation of UK Fujian Chinese)
倫敦華埠商會 (London Chinatown Chinese Association)
全英華人社團聯合總會(Confederations of Chinese Association UK)
全英中國學生學者聯誼會 (Chinese Students and Scholars Association UK)
英國北京聯合會 (UK Beijing Association)
英國福建同鄉聯誼總會 (UK Fujianese Association)
劍橋中國中心 (Cambridge Chinese Community Centre)
百祥塔藝術中心 (Pagoda Arts Centre Liverpool)
南安普敦中華藝術團 (Chinese Arts Southampton)
這些組織看似是平平無奇的組織,實則上它們是中共在民主國家的滲透,明裏暗裏做統戰工作,舉例「全英中國學生學者聯誼會」是旗幟鮮明的中國駐英大使館官方組織;舉辦集會的「英國福建華僑華人聯合總會」以及支持組織「倫敦華埠商會」,前年5月底曾在親北京報章刊登廣告,支持制訂《港區國安法》。
#UK#統戰#支共禍患#NeverTrustCCP#共匪#共賊#evilCCP#fxxkCCP#TakeDownTheCCP#天滅中共全黨死清光
立陶宛週五宣布驅逐三名中國大使館人員,限一周內離境,並向北京發送外交照會。自2021年立陶宛允許台灣設立代表處以來,兩國關係已惡化,最近因中國船隻涉嫌破壞波羅的海兩條海底光纜而進一步緊張。
立陶宛外交部表示,驅逐原因為「違反《維也納外交關係公約》及國際法」。立陶宛將與瑞典和芬蘭成立聯合調查小組,調查光纜被切斷事件。中共中國始終尋求干涉他國事務,甚至摧毀其他國家。
#立陶宛#波羅的海#海底電纜#russia#evilCCP#NeverTrustCCP#TakeDownCCP
On Friday, Lithuania announced the expulsion of three Chinese embassy staff, ordering them to leave within a week and sending a diplomatic note to Beijing. Tensions have worsened since Lithuania allowed Taiwan to establish a representative office in 2021, and recently over allegations of Chinese ships sabotaging two undersea cables in the Baltic Sea.
The Lithuanian Foreign Ministry cited "violations of the Vienna Convention and international law" as the reason for the expulsion. Lithuania will also form a joint investigation team with Sweden and Finland to probe the cable damage. Communist China is always seeking opportunities to interfere in other countries, even destroying them.
#Lithuania#BalticSea#UnderseaCables#Russia#EvilCCP#NeverTrustCCP#TakeDownCCP