Python中的字符串强化

Zyg*_*tas 77 python slug

我正在寻找"slugify"字符串"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)
Run Code Online (Sandbox Code Playgroud)

有人看到这个代码有任何问题吗?它工作正常,但也许我错过了一些东西或者你知道更好的方法吗?

kra*_*nko 126

有一个名为python的软件包python-slugify,它可以很好地进行重击:

pip install python-slugify
Run Code Online (Sandbox Code Playgroud)

像这样工作:

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")
Run Code Online (Sandbox Code Playgroud)

查看更多示例

这个包比你发布的更多(看看源代码,它只是一个文件).该项目仍然有效(在我最初回答前两天更新,四年后(最后检查2017-04-26),它仍然得到更新).

小心:周围有第二个包裹,名为slugify.如果您同时拥有它们,则可能会出现问题,因为它们具有相同的导入名称.刚刚命名的那个slugify并没有做我所做的全部快速检查:"Ich heiße"成为"ich-heie"(应该"ich-heisse"),所以一定要选择正确的,当使用pip或时easy_install.

  • `python-slugify`是在MIT下获得许可的,但是它使用了根据GPL许可的`Unidecode`,因此它可能不适合某些项目. (5认同)
  • @Rotareti `python-slugify` 现在默认为 Artistic License'd `text-unidecode` 而不是 GPL 许可的 `Unidecode`,解决了您的许可问题。https://github.com/un33k/python-slugify/commit/b8be7d69119dcceb9a3e0ce64a509415737190ac#diff-e4156a8bee1b298082516842836621b9 (2认同)

use*_*810 28

从这里安装unidecode表单以获得unicode支持

pip安装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)
Run Code Online (Sandbox Code Playgroud)

>>> my-custom-khello-vorld

  • 我建议不要使用像`str`这样的变量名.这隐藏了内置的`str`类型. (9认同)
  • unidecode是GPL,可能不适合某些人. (2认同)

vor*_*nin 11

有一个名为awesome-slugify的 python包:

pip install awesome-slugify
Run Code Online (Sandbox Code Playgroud)

像这样工作:

from slugify import slugify

slugify('one kožuš?ek')  # one-kozuscek
Run Code Online (Sandbox Code Playgroud)

awesome-slugify github页面

  • 好包!但要小心,它是根据GPL许可的. (2认同)

Nic*_*sta 6

它在Django中运行良好,所以我不明白为什么它不是一个好的通用slugify功能.

你有任何问题吗?

  • 对于lazies:`来自django.utils.text import slugify` (8认同)

Bjö*_*ist 6

问题在于ascii规范化线:

slug = unicodedata.normalize('NFKD', s)
Run Code Online (Sandbox Code Playgroud)

它被称为unicode规范化,它不会将许多字符分解为ascii.例如,它会从以下字符串中删除非ascii字符:

Mørdag -> mrdag
Æther -> ther
Run Code Online (Sandbox Code Playgroud)

更好的方法是使用试图将字符串音译为ascii 的unidecode模块.因此,如果您将以上行替换为:

import unidecode
slug = unidecode.unidecode(s)
Run Code Online (Sandbox Code Playgroud)

对于上述字符串以及许多希腊语和俄语字符,您可以获得更好的结果:

Mørdag -> mordag
Æther -> aether
Run Code Online (Sandbox Code Playgroud)


Ani*_*rma 5

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)
Run Code Online (Sandbox Code Playgroud)

这是django.utils.text中出现的slugify函数.这应该满足您的要求.