从Unicode格式的string中删除标点符号
我有一个从string列表中删除标点符号的函数:
def strip_punctuation(input): x = 0 for word in input: input[x] = re.sub(r'[^A-Za-z0-9 ]', "", input[x]) x += 1 return input
我最近修改我的脚本使用Unicodestring,所以我可以处理其他非西方字符。 这个函数在遇到这些特殊字符时会中断,并返回空的Unicodestring。 我怎样才能可靠地从Unicode格式的string中删除标点符号?
你可以使用unicode.translate()
方法:
import unicodedata import sys tbl = dict.fromkeys(i for i in xrange(sys.maxunicode) if unicodedata.category(unichr(i)).startswith('P')) def remove_punctuation(text): return text.translate(tbl)
您也可以使用正则expression式模块支持的r'\p{P}'
:
import regex as re def remove_punctuation(text): return re.sub(ur"\p{P}+", "", text)
如果你想在Python 3中使用JF Sebastian的解决scheme:
import unicodedata import sys tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P')) def remove_punctuation(text): return text.translate(tbl)
基于Daenyth答案的一个较短的版本
import unicodedata def strip_punctuation(text): """ >>> strip_punctuation(u'something') u'something' >>> strip_punctuation(u'something.,:else really') u'somethingelse really' """ punctutation_cats = set(['Pc', 'Pd', 'Ps', 'Pe', 'Pi', 'Pf', 'Po']) return ''.join(x for x in text if unicodedata.category(x) not in punctutation_cats) input_data = [u'somehting', u'something, else', u'nothing.'] without_punctuation = map(strip_punctuation, input_data)
您可以使用unicodedata
模块的category
函数遍历string,以确定该字符是否是标点符号。
有关category
可能输出,请参见unicode.org关于常规类别值的文档
import unicodedata.category as cat def strip_punctuation(word): return "".join(char for char in word if cat(char).startswith('P')) filtered = [strip_punctuation(word) for word in input]
另外,请确保您正确地处理编码和types。 这个演示文稿是一个很好的开始: http : //bit.ly/unipain