Saya sedang mencari cara terbaik untuk "slugify" string apa itu "slug" , dan solusi saya saat ini didasarkan pada resep ini
Saya telah mengubahnya sedikit menjadi:
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)
Adakah yang melihat ada masalah dengan kode ini? Ini berfungsi dengan baik, tetapi mungkin saya melewatkan sesuatu atau Anda tahu cara yang lebih baik?
Jawaban:
Ada paket python bernama
python-slugify
, yang melakukan pekerjaan slugifikasi dengan cukup baik:Bekerja seperti ini:
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")
Lihat Contoh lainnya
Paket ini melakukan lebih dari apa yang Anda posting (lihat sumbernya, ini hanya satu file). Proyek ini masih aktif (diperbarui 2 hari sebelum saya awalnya menjawab, lebih dari tujuh tahun kemudian (terakhir diperiksa 2020-06-30), masih diperbarui).
hati-hati : Ada paket kedua, bernama
slugify
. Jika Anda memiliki keduanya, Anda mungkin mendapatkan masalah, karena keduanya memiliki nama yang sama untuk impor. Yang baru saja disebutkanslugify
tidak melakukan semua yang saya periksa dengan cepat:"Ich heiße"
menjadi"ich-heie"
(seharusnya"ich-heisse"
), jadi pastikan untuk memilih yang benar, saat menggunakanpip
ataueasy_install
.sumber
python-slugify
dilisensikan di bawah MIT, tetapi menggunakanUnidecode
yang dilisensikan di bawah GPL, jadi mungkin tidak cocok untuk beberapa proyek.python-slugify
sekarang secara default menggunakan Lisensi Artistiktext-unidecode
alih-alih lisensi GPLUnidecode
, menangani masalah lisensi Anda. github.com/un33k/python-slugify/commit/…Instal formulir unidecode dari sini untuk dukungan unicode
# -*- 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)
sumber
slugify("My custom хелло ворлд")
denganslugify(u"My custom хелло ворлд")
, dan itu akan berhasil.str
. Ini menyembunyikanstr
tipe bawaan .Ada paket python bernama awesome-slugify :
Bekerja seperti ini:
from slugify import slugify slugify('one kožušček') # one-kozuscek
halaman github keren-slugify
sumber
slugify(text).lower()
jika menginginkannya.Ia bekerja dengan baik di Django , jadi saya tidak melihat mengapa itu bukan fungsi slugify tujuan umum yang baik.
Apakah Anda mengalami masalah dengan itu?
sumber
from django.utils.text import slugify
Masalahnya adalah dengan garis normalisasi ascii:
slug = unicodedata.normalize('NFKD', s)
Ini disebut normalisasi unicode yang tidak mendekomposisi banyak karakter menjadi ascii. Misalnya, ini akan menghapus karakter non-ascii dari string berikut:
Cara yang lebih baik untuk melakukannya adalah dengan menggunakan modul unidecode yang mencoba mentransliterasi string ke ascii. Jadi jika Anda mengganti baris di atas dengan:
import unidecode slug = unidecode.unidecode(s)
Anda mendapatkan hasil yang lebih baik untuk string di atas dan untuk banyak karakter Yunani dan Rusia juga:
sumber
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)
Ini adalah fungsi slugify yang ada di django.utils.text Ini harus mencukupi kebutuhan Anda.
sumber
Unidecode bagus; Namun, hati-hati: unidecode adalah GPL. Jika lisensi ini tidak cocok, gunakan yang ini
sumber
Beberapa opsi di GitHub:
Masing-masing mendukung parameter yang sedikit berbeda untuk API-nya, jadi Anda harus memeriksanya untuk mencari tahu apa yang Anda sukai.
Secara khusus, perhatikan berbagai opsi yang mereka sediakan untuk menangani karakter non-ASCII. Pydanny menulis entri blog yang sangat membantu yang menggambarkan beberapa perbedaan penanganan unicode di pustaka slugify berikut: http://www.pydanny.com/awesome-slugify-human-readable-url-slugs-from-any-string.html Entri blog ini agak ketinggalan jaman karena Mozilla
unicode-slugify
bukan lagi khusus-Django.Perhatikan juga bahwa saat
awesome-slugify
ini GPLv3, meskipun ada masalah terbuka di mana penulis mengatakan mereka lebih suka merilis sebagai MIT / BSD, hanya saja tidak yakin dengan legalitasnya: https://github.com/dimka665/awesome-slugify/issues/ 24sumber
Anda dapat mempertimbangkan untuk mengubah baris terakhir menjadi
slug=re.sub(r'--+',r'-',slug)
karena polanya
[-]+
tidak berbeda dengan-+
, dan Anda tidak terlalu peduli tentang mencocokkan hanya satu tanda hubung, hanya dua atau lebih.Tapi, tentu saja, ini kecil.
sumber
Pilihan lainnya adalah
boltons.strutils.slugify
. Boltons memiliki beberapa fungsi berguna lainnya juga, dan didistribusikan di bawahBSD
lisensi.sumber