Удалить пунктуацию из строк в формате Unicode
У меня есть функция, которая удаляет пунктуацию из списка строк:
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
Недавно я изменил свой сценарий, чтобы использовать строки Unicode, чтобы я мог обрабатывать другие не западные символы. Эта функция прерывается, когда встречает эти специальные символы, и просто возвращает пустые строки Unicode. Как я могу надежно удалить пунктуацию из строк в формате Unicode?
4 ответа
Вы могли бы использовать 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)
Вы также можете использовать r'\p{P}'
это поддерживается модулем regex:
import regex as re
def remove_punctuation(text):
return re.sub(ur"\p{P}+", "", text)
Если вы хотите использовать решение JF Sebastian в Python 3:
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)
Вы можете перебрать строку, используя unicodedata
модуля category
функция, чтобы определить, если символ пунктуации.
Для возможных выходов 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]
Кроме того, убедитесь, что вы правильно обрабатываете кодировки и типы. Эта презентация - хорошее место для начала: http://bit.ly/unipain
Немного более короткая версия, основанная на ответе 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)