Python删除额外的特殊unicode字符

时间:2016-11-19 07:44:16

标签: python unicode special-characters nltk text-processing

我正在使用python中的一些文本,它已经在内部以unicode格式,但我想摆脱一些特殊字符并用更标准的版本替换它们。

我目前有一条看起来像这样的线,但它变得越来越复杂,我发现它最终会带来更多麻烦。

function woocommerce_template_product_description() {
    wc_get_template( 'single-product/tabs/description.php' );
}
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_product_description', 20 );

例如,u \ 2018和\ u2019是leftright单引号。这些都是可以接受的,但对于这种类型的文本处理,我认为不需要它们。

this u \ 2013 EN DASH和this HORIZONTAL ELLIPSIS这样的东西绝对不需要。

有没有办法删除这些引号,并使用简单的标准引号,不会破坏文本处理'与nltk'并删除像EN DASH,HORIZONTAL ELLIPSIS这样的东西,而不是像我看到开始后面那样做怪物调用它在上面的示例代码中是什么?

5 个答案:

答案 0 :(得分:3)

如果您的文字是英文,并且想要以人类可读的方式进行清理,请使用第三方模块unidecode。它用最近的ascii外观替换了各种各样的字符。只需将unidecode.unidecode()应用于任何字符串即可进行替换:

from unidecode import unidecode
clean = unidecode(u'Some text: \u2018\u2019\u2013\u03a9')

答案 1 :(得分:1)

统一解决方案将使用预定义的替换对dict。这样的词典可以很容易地扩展(修改)。
使用re.complilere.sub函数的解决方案:

import re

d = {
    u"\u2018" : "'", u"\u2019" : "'", u"\u2013" : "", u"\u2026" : ""
}

pattern = re.compile(r'(' + '|'.join(re.escape(k) for k in d.keys()) + ')')
replaced = pattern.sub(lambda c: d[c.group()], infile.lower())

答案 2 :(得分:1)

如果你需要做这种角色"规范化"您可以考虑为Codec registry实施编解码器

该实现类似于@RomanPerekhrest提出的替换字符表。

实施编解码器

导入boolean login_success = user.login();模块,为您的编解码器命名(避免使用现有名称)。 创建编码表格({1}}时您将使用的表格:

codecs

上表可以"规范化"空格,连字符,引号。 这是规范化规则的地方......

然后,实现用于规范化字符串的函数:

u"something".encode(...)

您也可以实现解码,但需要反转import codecs NAME = "normalize" _ENCODING_TABLE = { u'\u2002': u' ', u'\u2003': u' ', u'\u2004': u' ', u'\u2005': u' ', u'\u2006': u' ', u'\u2010': u'-', u'\u2011': u'-', u'\u2012': u'-', u'\u2013': u'-', u'\u2014': u'-', u'\u2015': u'-', u'\u2018': u"'", u'\u2019': u"'", u'\u201a': u"'", u'\u201b': u"'", u'\u201c': u'"', u'\u201d': u'"', u'\u201e': u'"', u'\u201f': u'"', } , 最佳做法是准备反转表并稍后填写缺失的字符。

def normalize_encode(input, errors='strict'):
    output = u''
    for char in input:
        output += _ENCODING_TABLE.get(char, char)
    return output, len(input)

现在,一切准备就绪,您可以实施编解码器协议:

_ENCODING_TABLE

如何注册新创建的编解码器?

如果您有多个规范化编解码器,最佳做法是收集 它们位于专用包的_DECODING_TABLE = {v: k for k, v in _ENCODING_TABLE.items()} # missing characters... def normalize_decode(input, errors='strict'): output = u'' for char in input: output += _DECODING_TABLE.get(char, char) return output, len(input) 文件中 (例如:class Codec(codecs.Codec): def encode(self, input, errors='strict'): return normalize_encode(input, errors) def decode(self, input, errors='strict'): return normalize_decode(input, errors) class IncrementalEncoder(codecs.IncrementalEncoder): def encode(self, input, final=False): assert self.errors == 'strict' return normalize_encode(input, self.errors)[0] class IncrementalDecoder(codecs.IncrementalDecoder): def decode(self, input, final=False): assert self.errors == 'strict' return normalize_decode(input, self.errors)[0] class StreamWriter(Codec, codecs.StreamWriter): pass class StreamReader(Codec, codecs.StreamReader): pass def getregentry(): return codecs.CodecInfo(name=NAME, encode=normalize_encode, decode=normalize_decode, incrementalencoder=IncrementalEncoder, incrementaldecoder=IncrementalDecoder, streamreader=StreamReader, streamwriter=StreamWriter)

__init__.py

每当您需要编解码器时,请写下:

my_app.encodings

答案 3 :(得分:0)

使用内置字符串方法translate。它将Unicode序列的字典作为键并转换为值,可以是Unicode序数,字符串或None。值None无删除字符:

sample = '\u2018hello\u2019\u2013there\u2026'
print(sample)
replacements = { 0x2018 : "'",
                 0x2019 : "'",
                 0x2013 : '-',
                 0x2026 : '...' }
print(sample.translate(replacements))

输出:

‘hello’–there…
'hello'-there...

答案 4 :(得分:0)

re.sub也会这样做:

import re
tmp = re.sub(u'\u2019|\u2018', '\'', infile.lower())
tmp = re.sub(u'\u2013|\u2026', '', tmp)