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

 jfs16 июн. 2012 г., 22:43
strip_punctuation() следует принимать строки вместо списка строк, тогда, если вам это нужно, вы можетеlist_of_strings = map(strip_punctuation, list_of_strings)
 acpigeon16 июн. 2012 г., 22:50
Это может быть лучше на самом деле. Мне нравятся ваши и F.C. реализации, использующие категории Unicode.

Ответы на вопрос(3)

Решение Вопроса

Вы могли бы использовать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}' это поддерживаетсямодуль регулярных выражений:

import regex as re

def remove_punctuation(text):
    return re.sub(ur"\p{P}+", "", text)
 17 июн. 2012 г., 23:47
@acpigeon: я переехалtbl в глобальном масштабе, чтобы прояснить, что он должен быть создан только один раз
 28 сент. 2016 г., 18:11
@posdef это код Python 2 (читайте самый первый комментарий). Капляu'' префикс передr'' на Python 3 или использоватьu"\\p{P}+" (в этом случае вы должны избежать обратной реакции вручную).
 16 июн. 2012 г., 23:21
@ thg435: Я добавил ссылку на модуль регулярных выражений и сделал шаблон Unicode
 16 июн. 2012 г., 23:17
+1 за предложение регулярного выражения - этоthe путь сюда. Следует отметить, что он является нестандартным (пока) и должен быть установлен отдельно. Кроме того, в py2, вам нужен шаблон, чтобы быть Unicode (ur"..") для переключения режима сопоставления Юникода.
 09 нояб. 2016 г., 21:15
@DennisGolomazov: это правильно.| (U + 007C) являетсяMath Symbol: \p{Sm}это неUnicode punctuation, Возможно, вы хотите\p{posix_punct} ([[:punct:]]). В зависимости от вашего конкретного случая, может быть проще указать символы, которые вы хотите сохранить. Это может быть хороший отдельный вопрос, если у вас есть конкретный список требований (что сохранить, что удалить).

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

Вы можете перебрать строку, используяunicodedata Модуль & APOS; scategory функция, чтобы определить, если символ пунктуации.

Для возможных выходов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

 16 июн. 2012 г., 22:57
@acpigeon: Почему-то я думал, что вы можете назначать списки разреженным способом, не заполняя его заранее. Отредактировано с лучшим подходом.
 acpigeon16 июн. 2012 г., 22:47
+1 за unipain ссылку. Я пытаюсь реализовать это, но получаю "IndexError: индекс назначения списка вне диапазона" & quot; на строке результата [i]. Я буду продолжать возиться.
 15 янв. 2015 г., 20:36
В этом ответе есть небольшая, но важная ошибка: strip_punctuation фактически противоположен тому, что вы намереваетесь, и вернетсяonly пунктуация, потому что вы забылиnot в вашем понимании. Я бы отредактировал ответ, чтобы исправить это, за исключением того, что "изменения должны содержать не менее 6 символов".

Ваш ответ на вопрос