如何从Python字符串中删除unicode“标点符号”

时间:2011-03-24 04:36:10

标签: python unicode punctuation

这是问题,我有一个unicode字符串作为python sqlite查询的输入。查询失败('like')。结果是字符串,'FRANCE'没有6个字符,它有7个字符。第七是。 。 。 unicode U + FEFF,零宽度不间断空间。

如何在查询之前捕获一类此类内容?

3 个答案:

答案 0 :(得分:10)

您可以将unicodedata类别用作Python中unicode数据表的一部分:

>>> unicodedata.category(u'a')
'Ll'
>>> unicodedata.category(u'.')
'Po'
>>> unicodedata.category(u',')
'Po'

如您所见,标点字符的类别以“P”开头。 所以你需要通过char过滤掉char(使用列表推导)。

另见:

在你的情况下:

>>> unicodedata.category(u'\ufeff')
'Cf'

因此,您可以根据字符类别执行一些白名单。

答案 1 :(得分:1)

通常,如果您可以为您的用例定义此类内容,则应使用允许字符的白名单来完成输入验证。然后,您只需丢弃任何不在白名单上的内容(或完全拒绝输入)。

如果可以定义一组允许的字符,那么您可以使用正则表达式去除其他所有字符。

例如,假设您知道“country”只会包含大写的英文字母和空格,您可以删除其他所有内容,包括您喜欢的令人讨厌的unicode字母:

>>> import re
>>> country = u'FRANCE\ufeff'
>>> clean_pattern = re.compile(u'[^A-Z ]+')
>>> clean_pattern.sub('', country)
u'FRANCE'

如果无法定义一组允许的字符,那么您就会陷入困境,因为预测所有可能出现的数万个可能的意外unicode字符成为您的任务你 - 随着语言多年来不断发展,越来越多的规范被添加到规范中。

答案 2 :(得分:0)

这也是字节顺序标记,BOM。首先要清理你的字符串以消除它们,使用类似的东西:


>>> f = u'France\ufeff'
>>> f
u'France\ufeff'
>>> print f
France
>>> f.replace(u'\ufeff', '')
u'France'
>>> f.strip(u'\ufeff')
u'France'