質問

文字列があります。それはように見えます 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'

の効果のために正規表現を使用します /([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帰属
所属していません StackOverflow
scroll top