问题:例如清除在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
如果需要做高级操作,比如字符到字符的重映射或删除,那么translate()方法还是比较快的。