2016-04-06 11 views
1
string.maketrans("","") 

gibtWas Python string.maketrans tut ("", "")

\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13 
\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./:;<=>? 
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 
\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90 
\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2 
\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4 
\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9 
\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde 
\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed 
\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff 

Was bedeutet das?

Und wie hilft es Interpunktion in einer Zeichenfolge mit dem folgenden Aufruf bei der Beseitigung:

import string 
myStr.translate(string.maketrans("",""), string.punctuation) 
+2

Haben Sie die [docs] (https://docs.python.org/2/library/string.html#string.maketrans) gelesen? – MattDMo

+0

ja, aber wie hilft uns das große Durcheinander von maketrans dabei, Interpunktion zu vermeiden? – lars

+0

@lars: Es stellt eine Tabelle bereit, um die 'translate()' Methode zu füttern, die nichts unternimmt (so können Sie das zweite Argument der Methode übergeben und es nur Zeichen entfernen lassen). – martineau

Antwort

4

Ich nehme ein paar Freiheiten, da Python 2 die Zeile als Strings und Bytes durcheinander bringt. Es gibt 256 Bytes im Bereich von 0 bis 255. Sie können ihre Byte-Repräsentation mit chr() abrufen. Also, alle Bytes von 0 bis 255 so aussehen

>>> ''.join(map(chr, range(256))) 
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\ 
x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./:; 
<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80 
\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93 
\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6 
\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 
\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc 
\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf 
\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2 
\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' 

string.maketrans(from, to) erstellt eine Reihe von 256 Zeichen, wobei die Zeichen in from durch to ersetzt werden. Zum Beispiel string.maketrans('ab01', 'AB89') wird die Zeichenfolge von oben zurück, aber a wird durch A, b von B, 0 von 8 und 1 durch 9 ersetzt werden.

>>> string.maketrans('ab01', 'AB89') 
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\ 
x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./8923456789:; 
<=>[email protected][\\]^_`ABcdefghijklmnopqrstuvwxyz{|}~\x7f\x80 
\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93 
\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6 
\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 
\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc 
\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf 
\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2 
\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' 

Effektiv, string.maketrans('', '') == ''.join(map(chr, range(256))).

Dies dient als eine Karte, die, wenn str.translate() zur Verfügung gestellt wird, verwendet werden kann, um mehrere Zeichen mit einem Durchlauf über Ihre Zeichenfolge zu ersetzen. Für die obige Beispielkarte bleiben alle Zeichen gleich, mit Ausnahme von allen a, die in A, b in B usw. umgewandelt werden. Wenn Sie myStr.translate(string.maketrans('', '')) tun, ändern Sie einfach nichts in myStr.

Schließlich hat translate() ein zusätzliches Argument, deletechars. Wenn Sie eine Zeichenfolge für dieses Argument übergeben, übersetzt translate() alle Zeichen gemäß der von Ihnen bereitgestellten Zuordnung, ignoriert jedoch alle Zeichen in deletechars. Wenn Sie also alles zusammensetzen, ändert myStr.translate(string.maketrans('', ''), string.punctuation) kein Zeichen in der Zeichenfolge, ignoriert dabei jedoch alle Zeichen in string.punctuation. Effektiv haben Sie die Interpunktion in der Ausgabezeichenfolge entfernt.

0

string.maketrans(intab, outtab) gibt eine Übersetzungstabelle, die jedes Zeichen in dem intabstring in die Charakter-Karten an der gleichen Position in dem Registerkarte Ausgang String .

tran_table = string.maketrans(intab, outtab) 
print myStr.translate(tran_table) 

oben Der Code wird myStr Ihre erstellten Tabelle mit dann übersetzen. In Ihrem Fall generiert die Tabelle alle Zeichen, weil Sie nichts angeben.

+2

In Python Version 2.6+ können Sie einfach 'None' für das Argument _table_ verwenden und vermeiden, dass Sie die Identitätsübersetzungstabelle erstellen müssen. – martineau

0

Python 2.7 string.maketrans() gibt einen Byte-Wert zurück, wie Ihr Ergebnis, das mit string.translate() verwendet werden konnte.

string.translate(s, table) übersetzt Zeichen in s (nennen wir das c) in table[ord(c)]. So wird \x00 in table[0] übersetzt, und so weiter. In Ihrem Fall gibt es nur eine Identitätstabelle zurück.

Es sollte beachtet werden, dass string.translate in Python 2.7 und in Python 3 veraltet ist.Sie werden ersetzt durch bytes.maketrans(), bytes.translate() und die entsprechenden Verfahren für str und bytearray.

+1

Hinweis, sogar in Python 2 ist 'string.translate' sinnlos; 'str.translate' (eine Methode für alle 'str'-Objekte) ist schneller und erfordert keine Importe (obwohl' string.maketrans' immer noch bis Python 3 funktioniert). – ShadowRanger