44

我有一个从字符串列表中删除标点符号的函数:

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

4 回答 4

76

你可以使用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)
于 2012-06-16T20:11:54.563 回答
27

如果你想在 Python 3 中使用 JF Sebastian 的解决方案:

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)
于 2014-02-07T19:14:58.020 回答
9

unicodedata您可以使用模块的函数遍历字符串category以确定字符是否为标点符号。

有关 的可能输出category,请参阅 unicode.org 的关于General Category Values的文档

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

于 2012-06-16T19:34:19.343 回答
8

基于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)
于 2012-06-16T19:55:19.700 回答