在Python中映射Unicode到ASCII

2024-10-01 00:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过JSON格式的urlopen查询后收到字符串:

def get_clean_text(text):
    return text.translate(maketrans("!?,.;():", "        ")).lower().strip()

for track in json["tracks"]:
    print track["name"].lower()
    get_clean_text(track["name"].lower())

对于字符串“türlich,türlich(sicher,dicker)”我得到

File "main.py", line 23, in get_clean_text

return text.translate(maketrans("!?,.;():", "        ")).lower().strip()

TypeError: character mapping must return integer, None or unicode

我想将字符串格式化为“türlich türlich sicher dicker”。在


Tags: 字符串textnameincleangetreturntrack
1条回答
网友
1楼 · 发布于 2024-10-01 00:22:29

这个问题并不是一个完整的自包含的示例;我不能确定它是python2还是python3,maketrans来自哪里等等。我很有可能猜错了,这就是为什么您应该确保适当地标记您的问题并提供一个short, self contained, correct example。(这一点,以及其他许多人,其中一些人可能比我聪明,可能因为你的问题模棱两可而忽略了你的问题。)

假设您使用的是2.x,并且您已经完成了from string import *来获得maketrans,并且{}是unicode而不是str/bytes,那么您的问题是:

有两种类型的转换表:老式的8位表(只是256个字符的数组)和新型的稀疏表(它只是将一个字符的序号映射到另一个字符的dict)。str.translate函数可以使用其中一个,但是unicode.translate只能使用第二个函数(如果您稍微考虑一下,原因应该很明显)。在

string.maketrans函数生成老式的8位转换表。所以不能与unicode.translate一起使用。在

您可以随时编写自己的“makeunitrans”函数作为插入式替换,如下所示:

def makeunitrans(frm, to):
  return {ord(f):ord(t) for (f,t) in zip(frm, to)}

但如果你只想描绘出某些字符,你可以做一些更特殊的事情:

^{pr2}$

但是,从你最后的评论来看,我不确定translate是否是你想要的:

I want to format the string to be "türlich türlich sicher dicker"

如果你做对了,你将把字符串格式化为“türlich türlich sicher dicker”,因为你将所有标点符号映射到空格,而不是什么都没有。在

使用新样式的翻译表,您可以将任何您想要的映射为无,这就解决了这个问题。但是您可能想退一步问一下为什么首先使用translate方法,而不是多次调用replace(人们通常说“为了性能”,但是如果这是一个问题,那么您不会每次都在线构建翻译表)或使用一个普通的正则表达式。在

相关问题 更多 >