将一串文本转换为url-safe变量的最快方法是什么?

时间:2010-04-03 16:53:30

标签: python string

我想将一串文本(例如“用户名”)转换为我可以转换为网址的一部分,例如“用户名”。更换字符串的最快方法是什么(“ - ”代表“”)以及确保字符仅为[a-zA-Z0-9]?

4 个答案:

答案 0 :(得分:3)

string.translate通常是解决这些问题的最快方法(假设你的字符串不是unicode)。

def translate(x):
    if x == ' ': return '-'
    if 'a' <= x <= 'z': return x
    if 'A' <= x <= 'Z': return x
    if '0' <= x <= '9': return x

def mk_translator():
    translations = ''.join(translate(chr(c)) or chr(c) for c in xrange(256))
    deletions = ''.join(chr(c) for c in xrange(256) if translate(chr(c)) is None)
    return translations, deletions

def urlize(x, translator=mk_translator()):
    return x.translate(*translator)

print urlize('User Name')

答案 1 :(得分:1)

urllib.quote不会将空格变为短划线,而是变为%20,但其设计完全是为了使字符串网址安全。

答案 2 :(得分:0)

我已将此功能用于此目的:

import unicodedata

def slugify(item):
    ret = item.lower().replace(u' ', u'_')

    return unicodedata.normalize('NFKD', ret).encode('ascii', 'ignore')

我不确定这是否是最快的方式。

答案 3 :(得分:0)

我喜欢Ofri的简单和安全版本,而user97370的版本让空间看起来不错。

为什么不同时使用?

我会这样做:

import string, urllib
trans = string.maketrans(' ', '-')
x = 'a sentence with a bunch of spaces'
x2 = x.translate(trans)
x3 = urllib.quote(x2)
print x3 #--> 'a-sentence-with-a-bunch-of-spaces'

换句话说,做一种方法,然后做另一种方法。在url字符串中使用x3应该是安全的。您不需要为每个参数创建新参数,只需继续重新创建x,我使用x2x3来使其更清晰。你还可以在翻译矩阵中添加其他东西,如果你想要除去空格以外的东西。