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)