Stug slugification в Python

Я ищу лучший способ «slugify» string, что такое «slug» , и мое текущее решение основано на этом рецепте

Я немного изменил его:

s = 'String to slugify' slug = unicodedata.normalize('NFKD', s) slug = slug.encode('ascii', 'ignore').lower() slug = re.sub(r'[^a-z0-9]+', '-', slug).strip('-') slug = re.sub(r'[-]+', '-', slug) 

Кто-нибудь видит какие-либо проблемы с этим кодом? Он работает нормально, но, может быть, мне что-то не хватает или вы знаете лучший способ?

9 Solutions collect form web for “Stug slugification в Python”

Существует пакет python с именем python-slugify , который выполняет довольно хорошую работу:

 pip install python-slugify 

Работает так:

 from slugify import slugify txt = "This is a test ---" r = slugify(txt) self.assertEquals(r, "this-is-a-test") txt = "This -- is a ## test ---" r = slugify(txt) self.assertEquals(r, "this-is-a-test") txt = 'C\'est déjà l\'été.' r = slugify(txt) self.assertEquals(r, "cest-deja-lete") txt = 'Nín hǎo. Wǒ shì zhōng guó rén' r = slugify(txt) self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren") txt = 'Компьютер' r = slugify(txt) self.assertEquals(r, "kompiuter") txt = 'jaja---lol-méméméoo--a' r = slugify(txt) self.assertEquals(r, "jaja-lol-mememeoo-a") 

Дополнительные примеры

Этот пакет делает немного больше, чем вы опубликовали (посмотрите на источник, это всего лишь один файл). Проект по-прежнему активен (обновлен за 2 дня до моего ответа, более четырех лет спустя (последний раз проверен 2017-04-26), он по-прежнему обновляется).

осторожно : есть второй пакет, названный slugify . Если у вас есть оба из них, у вас может возникнуть проблема, так как они имеют одинаковое имя для импорта. Тот, который только что назвал slugify , не сделал все, что я быстро проверил: "Ich heiße" стал "ich-heie" (должен быть "ich-heisse" ), поэтому не забудьте выбрать правильный, когда используете pip или easy_install .

Установите форму unidecode отсюда для поддержки Unicode

pip install unidecode

 # -*- coding: utf-8 -*- import re import unidecode def slugify(text): text = unidecode.unidecode(text).lower() return re.sub(r'\W+', '-', text) text = u"My custom хелло ворлд" print slugify(text) 

>>> my-custom-khello-vorld

Существует пакет python с именем awesome-slugify :

 pip install awesome-slugify 

Работает так:

 from slugify import slugify slugify('one kožušček') # one-kozuscek 

awesome-slugify github page

Проблема заключается в линии нормализации ascii:

 slug = unicodedata.normalize('NFKD', s) 

Это называется нормализацией юникода, которая не разлагает множество символов на ascii. Например, это разделило бы символы, отличные от ascii, из следующих строк:

 Mørdag -> mrdag Æther -> ther 

Лучший способ сделать это – использовать модуль unidecode, который пытается транслитерировать строки в ascii. Поэтому, если вы замените указанную выше строку следующим образом:

 import unidecode slug = unidecode.unidecode(s) 

Вы получаете лучшие результаты для вышеупомянутых строк, а также для многих греческих и русских персонажей:

 Mørdag -> mordag Æther -> aether 

Он хорошо работает в Django , поэтому я не понимаю, почему это не будет хорошей функцией slugify общего назначения.

У вас проблемы с этим?

 def slugify(value): """ Converts to lowercase, removes non-word characters (alphanumerics and underscores) and converts spaces to hyphens. Also strips leading and trailing whitespace. """ value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii') value = re.sub('[^\w\s-]', '', value).strip().lower() return mark_safe(re.sub('[-\s]+', '-', value)) slugify = allow_lazy(slugify, six.text_type) 

Это функция slugify, присутствующая в django.utils.text Этого должно быть достаточно.

Unidecode хорош; однако будьте осторожны: unidecode – это GPL. Если эта лицензия не подходит, используйте эту

Вы можете рассмотреть возможность изменения последней строки на

 slug=re.sub(r'--+',r'-',slug) 

так как шаблон [-]+ не отличается от -+ , и вам не совсем нужно сопоставлять только один дефис, только два или более.

Но, конечно, это довольно незначительно.

Несколько вариантов GitHub:

  1. https://github.com/dimka665/awesome-slugify
  2. https://github.com/un33k/python-slugify
  3. https://github.com/mozilla/unicode-slugify

Каждый из них поддерживает несколько разных параметров для своего API, поэтому вам нужно просмотреть, что вы предпочитаете.

В частности, обратите внимание на различные варианты, которые они предоставляют для работы с символами, отличными от ASCII. Pydanny написал очень полезное сообщение в блоге, иллюстрирующее некоторые различия в обработке юникода в этих библиотеках slugify'ing: http://www.pydanny.com/awesome-slugify-human-readable-url-slugs-from-any-string.html Это сообщение в блоге немного устарело, потому что unicode-slugify Mozilla больше не зависит от Django.

Также обратите внимание, что в настоящее время awesome-slugify является GPLv3, хотя есть открытая проблема, когда автор говорит, что они предпочли бы выпускать как MIT / BSD, просто не уверены в законности: https://github.com/dimka665/awesome-slugify / вопросы / 24

Python - лучший язык программирования в мире.