文本清理问题会涉及到包括文本解析与数据处理等一系列问题。 在非常简单的情形下,你可能会选择使用字符串函数(比如 str.upper() 和 str.lower() )将文本转为标准格式。 使用 str.replace() 或者 re.sub() 的简单替换操作能删除或者改变指定的字符序列。 你同样还可以使用2.9小节的 unicodedata.normalize() 函数将unicode文本标准化。
然后,有时候你可能还想在清理操作上更进一步。比如,你可能想消除整个区间上的字符或者去除变音符。 为了这样做,你可以使用经常会被忽视的 str.translate() 方法。 为了演示,假设你现在有下面这个凌乱的字符串:
s = 'pýtĥöñ\fis\tawesome\r\n' s 'pýtĥöñ\x0cis\tawesome\r\n'
第一步是清理空白字符。为了这样做,先创建一个小的转换表格然后使用 translate() 方法:
remap = { ... ord('\t') : ' ', ... ord('\f') : ' ', ... ord('\r') : None # Deleted ... } a = s.translate(remap) a 'pýtĥöñ is awesome\n'
正如你看的那样,空白字符 \t 和 \f 已经被重新映射到一个空格。回车字符r直接被删除。
你可以以这个表格为基础进一步构建更大的表格。比如,让我们删除所有的和音符:
import unicodedata import sys cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) ... if unicodedata.combining(chr(c))) ... b = unicodedata.normalize('NFD', a) b 'pýtĥöñ is awesome\n' b.translate(cmb_chrs) 'python is awesome\n'
上面例子中,通过使用 dict.fromkeys() 方法构造一个字典,每个Unicode和音符作为键,对应的值全部为 None 。
然后使用 unicodedata.normalize() 将原始输入标准化为分解形式字符。 然后再调用 translate 函数删除所有重音符。 同样的技术也可以被用来删除其他类型的字符(比如控制字符等)。
作为另一个例子,这里构造一个将所有Unicode数字字符映射到对应的ASCII字符上的表格:
digitmap = { c: ord('0') + unicodedata.digit(chr(c)) ... for c in range(sys.maxunicode) ... if unicodedata.category(chr(c)) == 'Nd' } ... len(digitmap) 460
Arabic digits
x = '\u0661\u0662\u0663' x.translate(digitmap) '123'
另一种清理文本的技术涉及到I/O解码与编码函数。这里的思路是先对文本做一些初步的清理, 然后再结合 encode() 或者 decode() 操作来清除或修改它。比如:
a 'pýtĥöñ is awesome\n' b = unicodedata.normalize('NFD', a) b.encode('ascii', 'ignore').decode('ascii') 'python is awesome\n'
这里的标准化操作将原来的文本分解为单独的和音符。接下来的ASCII编码/解码只是简单的一下子丢弃掉那些字符。 当然,这种方法仅仅只在最后的目标就是获取到文本对应ACSII表示的时候生效。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。