Python使用str.maketrans实现字符替换时报参数长度不等错误
问题背景
需要实现输入字符串的自定义字符替换:将字符e替换为ᴇ、t替换为ᴛ,例如输入test时期望输出ᴛᴇsᴛ。编写代码运行时触发报错:
ValueError: the first two maketrans arguments must have equal length
即str.maketrans方法要求前两个传入参数长度必须相等。
出错的代码如下:
''' Qǫ Ww Eᴇ Rʀ Tᴛ Yʏ Uᴜ i Oᴏ Pᴘ α Ŝ̬ Dᴅ Fғ Gɢ Hʜ Jj Kᴋ Lʟ Zᴢ X Vᴠ β Nɴ Mᴍ 𓅱 ''' x = "qertyuIpaAsSdfghklxbBnm." y = "ǫᴇʀᴛʏᴜiᴘααŜ̬Ŝ̬ᴅғɢʜᴋʟXββɴᴍ𓅱" trans = str.maketrans(x, y) text = input("Write your sentence: ") print (text.translate(trans))
报错根因
str.maketrans(x, y)的映射规则是位置一一对应:x中第n位的字符,替换为y中第n位的字符,因此要求两个字符串的长度必须完全相等。
本次长度不匹配的核心原因是y中的Ŝ̬是组合字符:由基础字符Ŝ和下方的组合变音符号̬两个Unicode码位组成,在Python中统计长度时单个视觉上的Ŝ̬占2个字符位。代码中y里写了2个Ŝ̬,直接比等长的映射需求多了2个字符位:实际x长度为24,y长度为26,自然触发报错。
修复方法
不要用两个平行字符串写映射,改用字典作为str.maketrans的入参,键为待替换的原字符,值为替换后的目标字符,从根源上避免等长校验问题,也不会被组合字符的码位长度坑到,映射关系也更清晰易维护。
修复后的可运行代码:
char_map = { 'q': 'ǫ', 'Q': 'ǫ', 'e': 'ᴇ', 'E': 'ᴇ', 'r': 'ʀ', 'R': 'ʀ', 't': 'ᴛ', 'T': 'ᴛ', 'y': 'ʏ', 'Y': 'ʏ', 'u': 'ᴜ', 'U': 'ᴜ', 'i': 'i', 'I': 'i', 'o': 'ᴏ', 'O': 'ᴏ', 'p': 'ᴘ', 'P': 'ᴘ', 'a': 'α', 'A': 'α', 's': 'Ŝ̬', 'S': 'Ŝ̬', 'd': 'ᴅ', 'D': 'ᴅ', 'f': 'ғ', 'F': 'ғ', 'g': 'ɢ', 'G': 'ɢ', 'h': 'ʜ', 'H': 'ʜ', 'k': 'ᴋ', 'K': 'ᴋ', 'l': 'ʟ', 'L': 'ʟ', 'x': 'x', 'X': 'x', 'v': 'ᴠ', 'V': 'ᴠ', 'b': 'β', 'B': 'β', 'n': 'ɴ', 'N': 'ɴ', 'm': 'ᴍ', 'M': 'ᴍ', '.': '𓅱' } trans = str.maketrans(char_map) text = input("Write your sentence: ") print(text.translate(trans))
运行代码输入test即可得到预期输出ᴛᴇsᴛ,无长度报错。
内容的提问来源于stack exchange,提问作者Daffy
相关产品推荐
相关产品推荐

