标签:
问题:例如清除在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