在Python中将十六进制字符串转换为百分比编码字符串

时间:2010-10-15 01:23:21

标签: python percent-encoding

我有一个字符串。它看起来像s = 'e6b693e6a0abe699ab'

我想在每对字符前放一个百分号,所以percentEncode(s) == '%e6%b6%93%e6%a0%ab%e6%99%ab'

percentEncode(s)的好方法是什么?

(注意,我并不关心unreserved characters没有转换为ASCII。)

我可以想到这样做的大冗长方式,但我想要一些简单明了的东西,虽然我对Python很新,但如果Python不能很好地做到这一点,我会感到很惊讶。

6 个答案:

答案 0 :(得分:2)

>>> ''.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 :(得分:2)

哦,你的意思是:

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

虽然你可能是为了网址转义或其他类似的,但是有一个更适合你使用的库函数。

编辑添加 - 因为每个人都喜欢可爱的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 :(得分:2)

如果您手动进行URL编码,可能需要阅读此blog post。它解释了如何使用标准库的urllib模块的quote_plus函数执行此操作。

答案 3 :(得分:1)

将正则表达式用于/([0-9a-f]{2})/ig的效果,并替换为%\1

答案 4 :(得分: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提醒重用字符串iter。

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)

答案 5 :(得分:1)

根据你在初始问题中的评论,如果从编码前的初始字符串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'