我想将一串文本(例如“用户名”)转换为我可以转换为网址的一部分,例如“用户名”。更换字符串的最快方法是什么(“ - ”代表“”)以及确保字符仅为[a-zA-Z0-9]?
答案 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
,我使用x2
和x3
来使其更清晰。你还可以在翻译矩阵中添加其他东西,如果你想要除去空格以外的东西。