从字符串中删除特殊字符

10

我有一个包含特殊字符的字符串"Mikael Håfström",我该如何使用Python将其删除?


1
你的字符串是Unicode字符串吗?你想要删除字符还是用“标准”字符替换? - Sven Marnach
8
每个角色都有其独特的特点。 - Ignacio Vazquez-Abrams
3个回答

13

您可以使用unicodedata模块来规范化Unicode字符串并将它们编码为ASCII形式:

>>> import unicodedata
>>> source = u'Mikael Håfström'
>>> unicodedata.normalize('NFKD', source).encode('ascii', 'ignore')
'Mikael Hafstrom'

有一个显著的例外是,Python不识别字母'd'和'D',它们不会被编码为'd',因此它们将从结果中被简单地省略掉。这是某些南欧-东欧语言拉丁字母表中的一个带音腭硬颚塞擦音,所以根据您的受众或是否提供对Latin-1字符集的完全支持,它可能会或可能不会立即关注您。我目前正在本地运行Python 2.6.5(Mar 19 2010),问题仍然存在,尽管我确信它可能已经在新版本中得到解决。


我无法想象为什么你会把那两个IPA字母称为“显著”的例外。顺便说一句:s/龈硬颚/齿齦/. 在Latin-1中有几个字母和连字号不能规范化为ASCII。也许你把它们与冰岛语、法罗语和埃尔夫达利安语中使用的Eth混淆了。无论如何,NFKD花招需要内置一个例外列表。请参见我的答案。 - John Machin
对于我使用的南斯拉夫语言,我注意到没有支持“Dj”、“dj”、“Đ”或“đ”,因此有一个显著的例外。说实话,我没有任何北日耳曼语言的经验,这是一个相当专业的话题,所以我有点担心effbot上列出了9个异常情况。这些问题是否已经得到纠正? - Filip Dupanović
1
Dupanovic:“问题”?“支持”?“已更正”?您似乎误解了NFKD规范化的目的——如果可能的话,它是用于分解Unicode字符,而不是将它们压缩成ASCII。对于某些字符,这是不可能的;它们不能被分解。不需要进行任何更正。所有的unicodedata函数都直接从unicode.org提供的表格中获取数据。没有“问题”。 - John Machin
我终于注意到了我的错误,我说的是规范化而不是编码,这似乎带来了很多困惑。谢谢约翰,你友善的教学非常受欢迎! - Filip Dupanović

5
例如使用编码方法:u"Mikael Håfström".encode("ascii", "ignore")

你的方法抛出了异常,并且在添加Unicode作为输入编码时返回“Mikael Hfstrm”。 - toutpt

1

请查看effbot文章(包括代码)。它会尽可能地将字符转换为ASCII字符。可以扩展内置的转换表以处理许多其他字符(例如在东欧语言中使用的字符),这些字符没有规范分解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接