如果您需要进行这种字符“规范化”,可以考虑实现
编解码器注册表的
编解码器。
实现方式与@RomanPerekhrest提出的类似,使用替换字符表。
实现编解码器:
导入
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()}
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
)。
import codecs
import normalize
def search_function(encoding):
if encoding == normalize.NAME:
return normalize.getregentry()
return None
codecs.register(search_function)
每当您需要使用编解码器时,您会写下以下内容:
import my_app.encodings
normalize = my_app.encodings.normalize.NAME
def my_function():
normalized = my_string.encode(normalize)
decode()
吗?当你使用print()
时,你能看到这段代码吗? - furas