我有一个字符串。它看起来像s = 'e6b693e6a0abe699ab'。
我想在每对字符前面放一个百分号,所以percentEncode(s) == '%e6%b6%93%e6%a0%ab%e6%99%ab'.
有什么好的写作方法percentEncode(s)?
(注意,我不在乎未保留的字符不会转换为 ASCII。)
我可以想出很多冗长的方法来做到这一点,但我想要一些简单而漂亮的东西,虽然我对 Python 还很陌生,但如果 Python 不能很好地做到这一点,我会感到惊讶。
我有一个字符串。它看起来像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'
或使用重新
>>> import re
>>> re.sub("(..)","%\\1",s)
'%e6%b6%93%e6%a0%ab%e6%99%ab'
哦,你的意思是:
''.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'
如果您手动进行 URL 编码,您可能想阅读这篇博文。它解释了如何使用标准库的urllib模块quote_plus功能来做到这一点。
只是为了学术。
尝试使用尽可能多的迭代器。
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)
使用正则表达式来/([0-9a-f]{2})/ig代替%\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'