Question

J'ai une chaîne. Il ressemble à s = 'e6b693e6a0abe699ab'.

Je veux mettre un signe pour cent devant chaque paire de caractères, de sorte percentEncode(s) == '%e6%b6%93%e6%a0%ab%e6%99%ab'.

Qu'est-ce qu'une bonne façon d'écrire percentEncode(s)?

(Note, je ne se soucient pas caractères non réservés ne sont pas converti en ASCII.)

Je ne peux penser à grand bavard façons de le faire, mais je veux quelque chose de gentil et simple, et pendant que je suis assez nouveau pour Python, je serais si Python suprised ne peut pas le faire bien.

Était-ce utile?

La solution

>>> ''.join( "%"+i+s[n+1] for n,i in enumerate(s)  if n%2==0 )
'%e6%b6%93%e6%a0%ab%e6%99%ab'

Ou en utilisant re

>>> import re
>>> re.sub("(..)","%\\1",s)
'%e6%b6%93%e6%a0%ab%e6%99%ab'

Autres conseils

Au hasard de ce que vous faites URL codant manuellement, vous pouvez lire cette Blog post . Il explique comment faire en utilisant la bibliothèque standard de urllib du module quote_plus fonction.

Oh, tu veux dire:

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

Bien que probablement si vous faites cela pour échapper url ou quelque, il y a une fonction de bibliothèque plus appropriée à votre utilisation.

Edité pour ajouter - puisque tout le monde aime une solution itertools mignon:

>>> 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'

utiliser une expression rationnelle à l'effet de /([0-9a-f]{2})/ig et le remplacer par %\1

Pour être académique.

Essayer d'utiliser autant de itérateurs que possible.

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)

Merci à @tcarobruce pour le rappel de réutiliser la chaîne 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)

D'après un commentaire de la vôtre dans la question initiale, si à partir de la chaîne initiale initial_s avant son encodage en hexadécimal, vous pouvez avoir le résultat que:

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

>>> percent_encode('hello')
'%68%65%6c%6c%6f'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top