Frage

Ich habe einen String. Es sieht aus wie s = 'e6b693e6a0abe699ab'.

Ich mag vor jedem Paar von Zeichen ein Prozentzeichen setzen, so percentEncode(s) == '%e6%b6%93%e6%a0%ab%e6%99%ab'.

Was ist ein guter Weg, percentEncode(s) schreiben?

(Beachten Sie, ist mir egal, dass nicht reservierte Zeichen nicht sind umgewandelt in ASCII).

Das kann ich ausführliche Möglichkeiten des großen denken zu tun, aber ich mag etwas schön und einfach, und während ich zu Python ziemlich neu bin, würde ich überrascht, wenn Python dies schön nicht tun kann.

War es hilfreich?

Lösung

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

oder mit Re

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

Andere Tipps

Auf den unwahrscheinlichen Fall, dass Sie URL-kodiert tun manuell, möchten Sie vielleicht diese Blogbeitrag . Es wird erläutert, wie dies zu tun, die Standard-Bibliothek mit urllib Moduls quote_plus Funktion.

Oh, Sie meinen:

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

Obwohl wahrscheinlich, wenn Sie dies für url tun zu entkommen oder so gibt es eine Bibliotheksfunktion besser geeignet, um Ihre Nutzung.

Edited hinzufügen - da jeder eine nette itertools Lösung liebt:

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

eine Regex auf die Wirkung von /([0-9a-f]{2})/ig und Ersetzen mit %\1

Nur um akademisch.

Der Versuch, so viele Iteratoren wie möglich zu nutzen.

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)

Danke für die Erinnerung an @tcarobruce die Zeichenfolge iter wieder zu verwenden.

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)

Basierend auf einem Kommentar von Ihnen in der ersten Frage, wenn ausgehend von dem ursprünglichen Zeichenfolge initial_s vor der Codierung in hex, können Sie das Ergebnis haben, wie:

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

>>> percent_encode('hello')
'%68%65%6c%6c%6f'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top