it-swarm.com.de

String Slugification in Python

Ich bin auf der Suche nach dem besten Weg, "String" zu "Slugify" - was "Slug" ist und meine aktuelle Lösung basiert auf diesem Rezept

Ich habe es ein bisschen geändert in:

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)

Hat jemand Probleme mit diesem Code? Es funktioniert gut, aber vielleicht fehlt mir etwas oder du weißt einen besseren Weg?

68
Zygimantas

Es gibt ein Python-Paket mit dem Namen python-slugify , das ziemlich gute Arbeit leistet:

pip install python-slugify

Funktioniert so:

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")

Siehe Weitere Beispiele

Dieses Paket bietet etwas mehr als das, was Sie gepostet haben (schauen Sie sich die Quelle an, es ist nur eine Datei). Das Projekt ist immer noch aktiv (wurde 2 Tage vor meiner ursprünglichen Beantwortung aktualisiert, über vier Jahre später (zuletzt überprüft am 26.04.2017), es wird immer noch aktualisiert).

Caution: Es gibt ein zweites Paket mit dem Namen slugify. Wenn Sie beide haben, können Sie ein Problem bekommen, da sie den gleichen Namen für den Import haben. Die eben benannte Variable slugify hat nicht alles getan, was ich überprüft habe: "Ich heiße" wurde "ich-heie" (sollte "ich-heisse" sein). Wählen Sie also die richtige Version, wenn Sie pip oder easy_install verwenden.

113
kratenko

Installieren Sie das Unidecode-Formular von hier für die Unterstützung von 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

27
user1078810

Es gibt ein Python-Paket mit dem Namen awesome-slugify :

pip install awesome-slugify

Funktioniert so:

from slugify import slugify

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

awesome-slugify github page

8
voronin

Das Problem ist mit der ASCII-Normalisierungslinie:

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

Es heißt Unicode-Normalisierung , bei der nicht viele Zeichen in ASCII zerlegt werden. Zum Beispiel werden Nicht-ASCII-Zeichen aus den folgenden Zeichenfolgen entfernt:

Mørdag -> mrdag
Æther -> ther

Eine bessere Methode ist die Verwendung des Moduls unidecode , das versucht, Zeichenfolgen in ASCII zu transliterieren. Wenn Sie also die obige Zeile ersetzen durch:

import unidecode
slug = unidecode.unidecode(s)

Sie erhalten bessere Ergebnisse für die obigen Zeichenfolgen und auch für viele griechische und russische Zeichen:

Mørdag -> mordag
Æther -> aether
6
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)

Dies ist die Slugify-Funktion in Django.utils.text Dies sollte Ihren Anforderungen genügen.

5
Animesh Sharma

Es funktioniert gut in Django , daher kann ich nicht verstehen, warum es keine gute Allzweck-Slugify-Funktion ist.

Hast du Probleme damit?

5
Nick Presta

Unidecode ist gut; Seien Sie jedoch vorsichtig: Unidecode ist GPL. Wenn diese Lizenz nicht passt, verwenden Sie diese

3
Mikhail Korobov

Ein paar Optionen auf GitHub:

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

Jeder unterstützt geringfügig unterschiedliche Parameter für seine API, sodass Sie sich überlegen müssen, was Sie bevorzugen.

Achten Sie insbesondere auf die verschiedenen Optionen, die sie für den Umgang mit Nicht-ASCII-Zeichen bieten. Pydanny hat einen sehr hilfreichen Blog-Beitrag geschrieben, in dem einige der Unterschiede im Umgang mit Unicode in diesen Bibliotheken erläutert werden: http://www.pydanny.com/awesome-slugify-human-readable-url-slugs-from-any -string.html Dieser Blog-Beitrag ist etwas veraltet, weil Mozillas unicode-slugify ist nicht länger Django-spezifisch.

Beachten Sie auch, dass derzeit awesome-slugify ist GPLv3, obwohl es ein offenes Problem gibt, bei dem der Autor angibt, dass er es vorziehen würde, als MIT/BSD zu veröffentlichen, nur nicht sicher, ob dies legal ist: https://github.com/dimka665/awesome-slugify/ Fragen/24

2
Jeff Widman

Sie könnten die letzte Zeile in ändern 

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

da sich das Muster [-]+ nicht von -+ unterscheidet, und Sie nicht wirklich nur einen Bindestrich, nur zwei oder mehr, suchen. 

Aber das ist natürlich ziemlich unbedeutend.

1
unutbu

Eine weitere Option ist boltons.strutils.slugify . Boltons hat auch einige andere nützliche Funktionen und wird unter einer BSD Lizenz vertrieben.

0
ostrokach