Какой самый быстрый способ преобразовать строку текста в URL-безопасную переменную? - PullRequest
2 голосов
/ 03 апреля 2010

Я хотел бы преобразовать строку текста, например, «Имя пользователя», во что-то, что я могу превратить в часть URL, например, «Имя пользователя». Какой самый быстрый способ сделать замену строки ("-" для ""), а также убедиться, что символы только [a-zA-Z0-9]?

Ответы [ 4 ]

3 голосов
/ 03 апреля 2010

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 голос
/ 03 апреля 2010

urllib.quote не превращает пробелы в тире, но в% 20, но предназначен именно для того, чтобы сделать строку безопасной для URL.

0 голосов
/ 24 апреля 2013

Мне нравится версия 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'

Другими словами, выполните один метод, а затем другой. x3 должно быть безопасно для использования в строке URL. Вам не нужно создавать новые параметры для каждого, просто продолжайте воссоздавать x, я использовал x2 и x3, чтобы сделать его более понятным. Вы также можете добавить другие вещи в матрицу перевода, если есть вещи, кроме пробелов, от которых вы хотите избавиться.

0 голосов
/ 03 апреля 2010

Я использовал эту функцию для этой цели:

import unicodedata

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

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

Я не уверен, что это самый быстрый способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...