2

文字列があります。のように見えますs = 'e6b693e6a0abe699ab'

文字のすべてのペアの前にパーセント記号を付けたいので、percentEncode(s) == '%e6%b6%93%e6%a0%ab%e6%99%ab'

書くのに良い方法は何percentEncode(s)ですか?

予約されていない文字がASCIIに変換されなくてもかまいません。)

私はこれを行うための大きな冗長な方法を考えることができますが、私は何か素晴らしくてシンプルなものが欲しいです、そして私はPythonにかなり慣れていませんが、Pythonがこれをうまくできないとしたら驚きます。

4

6 に答える 6

3
>>> ''.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'
于 2010-10-15T01:28:36.780 に答える
2

ああ、あなたは意味します:

''.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'
于 2010-10-15T01:30:50.613 に答える
2

手動でURLエンコードを行っている可能性が低い場合は、このブログ投稿を読むことをお勧めします。urllib標準ライブラリのモジュールのquote_plus関数を使用してこれを行う方法を説明します。

于 2010-10-15T01:31:52.460 に答える
1

の効果に正規表現を使用し、/([0-9a-f]{2})/igに置き換えます%\1

于 2010-10-15T01:31:00.293 に答える
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)

文字列iterを再利用することを思い出させてくれた@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)
于 2010-10-15T02:23:36.057 に答える
1

最初の質問でのあなたのコメントに基づいて、initial_s16進数にエンコードする前に最初の文字列から開始すると、次のような結果になる可能性があります。

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

>>> percent_encode('hello')
'%68%65%6c%6c%6f'
于 2010-10-16T14:44:00.967 に答える