utf8 open error python unicode

open - python unicode to utf8



Eliminar la puntuaciĆ³n de las cadenas formateadas Unicode (4)

Tengo una función que elimina la puntuación de una lista de cadenas:

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

Recientemente modifiqué mi script para usar cadenas Unicode para poder manejar otros caracteres no occidentales. Esta función se rompe cuando encuentra estos caracteres especiales y simplemente devuelve cadenas Unicode vacías. ¿Cómo puedo eliminar de manera confiable la puntuación de cadenas con formato Unicode?


Podría usar el método 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)

También puede usar r''/p{P}'' que es compatible con el módulo regex :

import regex as re def remove_punctuation(text): return re.sub(ur"/p{P}+", "", text)


Puede iterar a través de la cadena usando la unicodedata de category del módulo unicodedata para determinar si el carácter es de puntuación.

Para conocer los posibles resultados de la category , consulte el documento de unicode.org en Valores generales de categoría

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]

Además, asegúrese de que está manejando las codificaciones y los tipos correctamente. Esta presentación es un buen lugar para comenzar: http://bit.ly/unipain


Si quieres usar la solución de JF Sebastian en 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)


Una versión más corta basada en la respuesta de 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)