解决python 文本过滤和清理问题


Posted in Python onAugust 28, 2019

问题

某些无聊的脚本小子在Web页面表单中填入了“pýtĥöñ”这样的文本,我们想以某种方式将其清理掉。

解决方案

文本过滤和清理所涵盖的范围非常广泛,涉及文本解析和数据处理方面的问题。在非常简单的层次上,我们可能会用基本的字符串函数(例如str.upper()和str.lower())将文本转换为标准形式。简单的替换操作可通过str.replace()或re.sub()来完成,它们把重点放在移除或修改特定的字符序列上。也可以利用unicodedata.normalize()来规范化文本。

然而我们可能想更进一步。比方说也许想清除整个范围内的字符,或者去掉音符标志。要完成这些任务,可以使用常被忽视的str.translate()方法。为了说明其用法,假设有如下这段混乱的字符串:

>>> s = 'pytĥon\fis\tawesome\r\n'
>>> s
'pytĥon\x0cis\tawesome\r\n'
>>>

第一步是清理空格。要做到这步,先建立一个小型的转换表,然后使用translate()方法:

>>> remap = {
...   ord('\t') : ' ',
...   ord('\f') : ' ',
...   ord('\r') : None    # Deleted
... }
>>> a = s.translate(remap)
>>> a
'pytĥon is awesome\n'

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

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

>>> 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
'pytĥon 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
'pytĥon is awesome\n'
>>> b = unicodedata.normalize('NFD', a)
>>> b.encode('ascii', 'ignore').decode('ascii')
'python is awesome\n'
>>>

这里的normalize()方法先对原始文本做分解操作。后续的ASCII编码/解码只是简单地一次性丢弃所有不需要的字符。很显然,这种方法只有当我们的最终目标就是ASCII形式的文本时才有用。

讨论

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

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

如果试着调用它,就会发现这比使用translate()或者正则表达式的方法要快得多。

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

从整体来看,我们应该在具体的应用中去进一步揣摩性能方面的问题。不幸的是,想在技术上给出一条“放之四海而皆准”的建议是不可能的,所以应该尝试多种不同的方法,然后做性能统计分析。

尽管本节的内容主要关注的是文本,但类似的技术也同样适用于字节对象(byte),这包括简单的替换、翻译和正则表达式。

总结

以上所述是小编给大家介绍的解决python 文本过滤和清理问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python基础教程之序列详解
Aug 29 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
Python对象与引用的介绍
Jan 24 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
在Python 的线程中运行协程的方法
Feb 24 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
pytorch实现ResNet结构的实例代码
May 17 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 Python
解决Python对齐文本字符串问题
Aug 28 #Python
python+jinja2实现接口数据批量生成工具
Aug 28 #Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 #Python
opencv实现简单人脸识别
Feb 19 #Python
Atom Python 配置Python3 解释器的方法
Aug 28 #Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 #Python
Numpy的简单用法小结
Aug 28 #Python
You might like
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
深入理解js promise chain
2016/05/05 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
python 带时区的日期格式化操作
2020/10/23 Python
python入门教程之基本算术运算符
2020/11/13 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
售后专员岗位职责
2013/12/08 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
老公保证书范文
2014/04/29 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书