【python cookbook】【字符串与文本】12.文本过滤和清理

 问题:例如清除在web页面表单中填入了pýtĥöñ is这样的文本

解决方法:str.translate()方法

s = 'p\xfdt\u0125\xf6\xf1\x0cis\tawesome\r\n'
print(s)

# (a) Remapping whitespace  先建立一个小型的转换表,然后使用translate()方法
remap = {
    ord('\t') : ' ',
    ord('\f') : ' ',
    ord('\r') : None      # Deleted
}

a = s.translate(remap)
print('whitespace remapped:', a)
print ('------------------------------')

可以看到,类似\t和\f这样的空格符已经被重新映射成一个单独的空格。回车符\r已经完全被删除掉了。

利用重新映射的思想进一步构建出更加庞大的转换表,例如,我们把所有的Unicode组合字符都去掉;

s = 'p\xfdt\u0125\xf6\xf1\x0cis\tawesome\r\n'
print(s)

# (a) Remapping whitespace
remap = {
    ord('\t') : ' ',  #ord(c):返回单字符c在ASCII中对应的整数,例如ord('a')->97
    ord('\f') : ' ',
    ord('\r') : None      # Deleted
}

a = s.translate(remap)

# (b) Remove all combining characters/marks
import unicodedata
import sys
cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode)
                         if unicodedata.combining(chr(c))) #dict.fromkeys()方法构建了一个将每个Unicode组合字符都映射为None的字典。

b = unicodedata.normalize('NFD', a)  #原始输入被转换为分离的形式
c = b.translate(cmb_chrs)    #删除所有的重音符号
print('accents removed:', c)  
>>> ================================ RESTART ================================
>>> 
pýtĥöñis    awesome


accents removed: python is awesome

>>> 
另一种用来清理文本的技术涉及I/O解码和编码函数。
大致思路:首先对文本做初步的清理,然后通过结合encode()和decode()操作来修改或清理文本。
s = 'p\xfdt\u0125\xf6\xf1\x0cis\tawesome\r\n'
print(s)

# (a) Remapping whitespace
remap = {
    ord('\t') : ' ',
    ord('\f') : ' ',
    ord('\r') : None      # Deleted
}

a = s.translate(remap)

# (b) Remove all combining characters/marks
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)

# (c) Accent removal using I/O decoding
d = b.encode('ascii','ignore').decode('ascii')
print('accents removed via I/O:', d)
>>> ================================ RESTART ================================
>>> 
pýtĥöñis    awesome


accents removed via I/O: python is awesome

>>> 

很显然,这种方法只有当我们的最终目标就是ASCII形式的文本时才有用。

补充:

文本清理和过滤的一个主要问题是运行时的性能问题,对于简单的操作,str.replace()通常是最快的方式,即使必须多次调用它也是如此。比如要清理掉空格符,可以编写如下的代码:

def clean_spaces(s):
    s=s.replace('\r','')
    s=s.replace('\t',' ')
    s=s.replace('\f',' ')
    return s

如果需要做高级操作,比如字符到字符的重映射或删除,那么translate()方法还是比较快的。

 

posted @ 2016-08-21 18:36  垄上行  阅读(821)  评论(0编辑  收藏  举报