Превратите шестнадцатеричную строку в строку, закодированную в процентах в Python - PullRequest
1 голос
/ 15 октября 2010

У меня есть строка. Похоже s = 'e6b693e6a0abe699ab'.

Я хочу поставить знак процента перед каждой парой символов, поэтому percentEncode(s) == '%e6%b6%93%e6%a0%ab%e6%99%ab'.

Какой хороший способ написания percentEncode(s)?

(Обратите внимание, мне все равно, что незарезервированные символы не преобразуются в ASCII.)

Я могу придумать большие подробные способы сделать это, но я хочу что-то приятное и простое, и хотя я довольно новичок в Python, я был бы удивлен, если Python не может сделать это хорошо.

Ответы [ 6 ]

2 голосов
/ 15 октября 2010

Если вы вручную выполняете кодировку URL-адресов, возможно, вы захотите прочитать это сообщение в блоге . В нем объясняется, как это сделать с помощью стандартной библиотеки urllib модуля quote_plus.

2 голосов
/ 15 октября 2010

О, вы имеете в виду:

''.join(["%%%s" % pair for pair in [s[i:i+2] for i in range(0,len(s),2)]])

Хотя, возможно, если вы делаете это для экранирования URL или чего-то подобного, есть библиотечная функция, более подходящая для вашего использования.

Отредактировано длядобавить - так как все любят симпатичное решение itertools:

>>> from itertools import izip, cycle
>>> its = iter(s)
>>> tups = izip(cycle('%'), its, its)
>>> ''.join(''.join(t) for t in tups)
'%e6%b6%93%e6%a0%ab%e6%99%ab'
2 голосов
/ 15 октября 2010
>>> ''.join( "%"+i+s[n+1] for n,i in enumerate(s)  if n%2==0 )
'%e6%b6%93%e6%a0%ab%e6%99%ab'

Или используя re

>>> import re
>>> re.sub("(..)","%\\1",s)
'%e6%b6%93%e6%a0%ab%e6%99%ab'
1 голос
/ 16 октября 2010

Исходя из вашего комментария в начальном вопросе, если начиная с начальной строки initial_s до ее кодирования в шестнадцатеричный код, вы можете получить результат как:

def percent_encode(initial_s):
    return ''.join('%%%02x' % ord(c) for c in initial_s)

>>> percent_encode('hello')
'%68%65%6c%6c%6f'
1 голос
/ 15 октября 2010

Просто чтобы быть академиком.

Попытка использовать как можно больше итераторов.

s = 'e6b693e6a0abe699ab'

from itertools import islice, izip, cycle, chain

def percentEncode(s):
    percentChars = cycle('%')
    firstChars = islice(s,0,None, 2)
    secondChars = islice(s,1,None, 2)
    return ''.join(chain.from_iterable(izip(percentChars, firstChars, secondChars)))


if __name__ == '__main__':
     print percentEncode(s)

Спасибо @tcarobruce за напоминание о необходимости повторного использования строки.

s = 'e6b693e6a0abe699ab'

from itertools import islice, izip, cycle, chain

def percentEncode(s):
    iter_s = iter(s)
    return ''.join(chain.from_iterable(izip(cycle('%'), iter_s, iter_s)))

if __name__ == '__main__':
     print percentEncode(s)
1 голос
/ 15 октября 2010

используйте регулярное выражение с эффектом /([0-9a-f]{2})/ig и замените на %\1

...