簡體   English   中英

在Python中將十六進制字符串轉換為百分比編碼的字符串

[英]Turn a hex string into a percent encoded string in 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'

或使用re

>>> 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)]])

盡管可能是為了進行轉義或類似的操作,但是有一個庫函數更適合您的使用。

編輯添加-由於每個人都喜歡可愛的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函數來執行此操作。

使用正則表達式來實現/([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提醒您重用字符串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)

根據您在初始問題中的評論,如果從初始字符串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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM