Удалить пунктуацию из строк в формате 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

Недавно я изменил свой script, чтобы использовать строки Unicode, чтобы я мог обрабатывать другие незападные символы. Эта функция прерывается, когда она встречает эти специальные символы и просто возвращает пустые строки Unicode. Как я могу надежно удалить пунктуацию из строк в формате Unicode?

Ответ 1

Вы можете использовать метод 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 module:

import regex as re

def remove_punctuation(text):
    return re.sub(ur"\p{P}+", "", text)

Ответ 2

Если вы хотите использовать решение J.F. 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)

Ответ 3

Вы можете перебирать строку, используя функцию 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

Ответ 4

Немного более короткая версия, основанная на Daenyth answer

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)

Ответ 5

if unicodedata.category(unichr(i)).startswith('P'))

Что здесь за буква "P"? или {P} в старом синтаксисе? Какие символы/знаки препинания начинаются с буквы P? Я знаю, что мне здесь не хватает чего-то фундаментального.