Превратите шестнадцатеричную строку в строку с процентной кодировкой в Python
-
30-09-2019 - |
Вопрос
У меня есть веревка.Это выглядит как s = 'e6b693e6a0abe699ab'
.
Я хочу поставить знак процента перед каждой парой символов, поэтому percentEncode(s) == '%e6%b6%93%e6%a0%ab%e6%99%ab'
.
Как хорошо писать percentEncode(s)
?
(Заметьте, меня это не волнует незарезервированные символы не конвертируются в ASCII.)
Я могу придумать многословные способы сделать это, но мне нужно что-то красивое и простое, и хотя я новичок в Python, я был бы удивлен, если бы Python не смог сделать это хорошо.
Решение
>>> ''.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'
Другие советы
В случае вероятности, что вы делаете URL-кодирование вручную, вы можете прочитать это Сообщение блога. Отказ Это объясняет, как это сделать, используя стандартную библиотеку urllib
модуль quote_plus
функция.
О, вы имеете в виду:
''.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'
Используйте Regex для эффекта /([0-9a-f]{2})/ig
и заменить с помощью %\1
Просто быть академическим.
Пытаясь использовать как можно больше итераторов.
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)
На основе вашего комментария в исходном вопросе, если начинать с исходной строки 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'