string.maketrans("","")
gives
\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 !"#$%&\'()*+,-./0123456789:;<=>?
@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
What does this mean?
And how does it help in removing punctuation in a string with the following call:
import string
myStr.translate(string.maketrans("",""), string.punctuation)
string.maketrans(intab, outtab)
returns a translation table that maps each character in the intabstring into the character at the same position in the outtab string.The code above will then translate
myStr
using your created table. In your case the table generates all characters because you do not specify anything.I'll take some liberties, since Python 2 muddles the line being strings and bytes. There are 256 bytes, ranging from 0 to 255. You can get their byte representation by using
chr()
. So, all the bytes from 0 to 255 look like thisstring.maketrans(from, to)
creates a string of 256 characters, where the characters infrom
will be replaced byto
. For example,string.maketrans('ab01', 'AB89')
will return the string from above, buta
will be replaced byA
,b
byB
,0
by8
and1
by9
.Effectively,
string.maketrans('', '') == ''.join(map(chr, range(256)))
.This serves as a map, which when provided to
str.translate()
, it can be used to replace multiple characters with one pass over your string. For the example map above, all characters will remain the same, except from alla
turning intoA
,b
intoB
, etc. If you domyStr.translate(string.maketrans('', ''))
, you simply don't change anything inmyStr
.Finally,
translate()
has one additional argument,deletechars
. If you pass a string for that argument,translate()
will translate all characters according to the mapping you provide, but it will ignore, any characters indeletechars
. So, putting it all together,myStr.translate(string.maketrans('', ''), string.punctuation)
does not change any character in the string, but in the process will ignore any character instring.punctuation
. Effectively, you have removed the punctuation in the output string.Python 2.7's string.maketrans() returns a byte value, like your result, which could be used with string.translate().
string.translate(s, table)
translates characters ins
(Let's call thisc
) intotable[ord(c)]
. So\x00
is translated intotable[0]
, and so on. In your case, it's just returning an identity table.It should be noted that
string.translate
is deprecated in Python 2.7, and in Python 3.1 and onwards, they are replaced bybytes.maketrans()
,bytes.translate()
, and the corresponding methods forstr
ansbytearray
.