码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-08-21 19:55:44      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

 问题:例如清除在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()方法还是比较快的。

 

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

标签:

原文地址:http://www.cnblogs.com/apple2016/p/5793248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!