maktrans和translate详解

str.marktrans方法:生成一个dict表。对应翻译表(asc码格式),
如:t = str.maketrans(‘abcdefghi’, ‘123456789’,“abfgjk”)
返回:{97: None, 98: None, 99: 51, 100: 52, 101: 53, 102: None, 103: None, 104: 56, 105: 57, 106: None, 107: None},
说明:比如第一个参数里面的第一个字符 asc码97的字符(a)对应为None(本来应该对应于第二个参数中的数字1,但是由于被第三个参数过滤了,所以对应成为了None,而第一个参数中的第三个字符asc码99的字符(c)对应的为第二个参数里面的数字3(数字3的asc码是51)…

translate方法:就是把原始str中每个字符用对照翻译表中字符对应替换掉,对应None的就表示删除
def test_maketrans_translate():
# maketrans方法返回类型:字典,基本功能就是将字符串每个字符转为asc码
# 如果提供一个参数:这个参数就必须是字典,方法将字典的key转换成asc码后返回。
a=str.maketrans({1:'b',3:'d'})
print (type(a),a) #< class 'dict'> {1: 'b', 3: 'd'}
a = str.maketrans({'1': 'b', '3': 'd'})
print(type(a), a) # <class 'dict'> {49: 'b', 51: 'd'}

# 如果提供二个参数:两个参数都必须是字符串,而且要长度一样。
b=str.maketrans('abcdefg','1234567')
print(type(b),b) # <class 'dict'> {97: 49, 98: 50, 99: 51, 100: 52, 101: 53, 102: 54, 103: 55}
# b = str.maketrans('abcdefg', '12345')
# print(type(b), b) # 报错,the first two maketrans arguments must have equal length(前两个参数必须一样长)

# 如果提供三个参数:
# 第一、二个参数和上面一样
# 第三个参数:需要设置为None的字符。
# 网上多会说是过滤之类的,其实简单说就是:
# 如果第一个参数中有第三个参数中的字符就忽略,然后将第三个参数中的所有字符直接对应为None
# 通常使用这个参数都是为 提供给translate函数从某字符串中删除这个参数中包含的特定字符用。
c = str.maketrans('abcdefghi', '123456789',"abfgjk")
print("2=", type(c), c) # <class 'dict'> {97: None, 98: None, 99: 51, 100: 52, 101: 53, 102: None, 103: None, 104: 56, 105: 57, 106: None, 107: None}
# 本来a、b、f、g 字符对应的是1、2,6,7,但是由于第三参数abfg 定义了这4个字符被忽略,因此结果中出现了97:None,98:None...102:None,103:None
# 同时在第三个参数中"jk"还有两个字符,因此结果中还多出了 106: None, 107: None
c= str.maketrans('ab', 'AB', "b")
print("3=" ,type(c), c) # <class 'dict'> {97: 65, 98: None} # <class 'dict'> {97: 65, 98: None}

# 下面演示 translate 方法
# translate方法返回:字符串,实际就是把原始str中每个字符用对照表中字符对应替换,对照表中None的字符实际效果就是被删除了
# str.translate(table[, deletechars]);
# 参数:# table -- 对照翻译表,翻译表是通过maketrans方法转换而来。 # deletechars -- 字符串中要过滤的字符列表。
import string
s1 = "abcdefg"
# 更换字符
t1= str.maketrans('abc', 'ABC',) # 生成了一个对照翻译表,说明a换成A,b换成B...
print("4 替换:"+ s1+"->",s1.translate(t1)) # abcdefg-> ABCdefg
# 删除字符(实际就是生成 字符对应None的翻译表)
t1=str.maketrans("","","abc") #实际生成了{97:None,98:None,99:None}的对应翻译表
print("5 删除:"+ s1+"->",s1.translate(t1)) # 删除:abcdefg-> defg

# 实战:删除句子中的标点
s1 = "how old are you?I'm 10 years old." # 句子中有多个标点,需要去除
# 第一步:生成需要删除标点对应None的翻译表,结果为:# <class 'dict'> {33: None, 34: None, 35: None, 36: None ...}
t1=str.maketrans("","",string.punctuation) # string.punctuation含各种标点的字符串(实际就是字符串:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ ))
# 第二步:删除句子中的标点
print("原始句子:" + s1) # 原始句子:how old are you?I'm 10 years old.
print("删除标点:" + s1.translate(t1) ) # 删除标点:how old are youIm 10 years old

if __name__ == "__main__":
test_maketrans_translate()
————————————————
版权声明:本文为CSDN博主「不甜」的原创文章。
原文链接:https://blog.csdn.net/zyself/article/details/90481639

posted @ 2019-09-10 17:52  菜鸟阿呆  阅读(572)  评论(0编辑  收藏  举报