《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串
审查清理文本字符串
问题
一些无聊的幼稚黑客将你的网站页面中的“python”改成“pýtĥöñ”,然后你想将这些字符清理掉。
解法
文本清理问题会涉及到包括文本解析与数据处理等一系列问题。在非常简单的情形下,你可能会选择使用字符串函数 (比如 str.upper() 和 str.lower() ) 将文本转为标准格式。使用 str.replace() 或者 re.sub() 的简单替换操作能删除或者改变指定的字符序列。你同样还可以使用 2.9 小节的 unicodedata.normalize() 函数将 unicode文本标准化。
然后,有时候你可能还想在清理操作上更进一步。比如,你可能想消除整个区间上的字符或者去除变音符。为了这样做,你可以使用经常会被忽视的 str.translate()方法。为了演示,假设你现在有下面这个凌乱的字符串:
>>> s = 'pýtĥöñ\fis\tawesome\r\n'
>>> s
'pýtĥöñ\x0cis\tawesome\r\n'
>>>
第一步是清理空白字符。为了这样做,先创建一个小的转换表格然后使用translate() 方法:
>>> remap = {... ord('\t') : ' ',
... ord('\f') : ' ',
... ord('\r') : None # Deleted
... }
>>> a = s.translate(remap)
>>> a
'pýtĥöñ is awesome\n'
>>>
正如你看的那样,空白字符 nt 和 nf 已经被重新映射到一个空格。回车字符 r 直接被删除。
你可以以这个表格为基础进一步构建更大的表格。比如,让我们删除所有的和音符:
>>> 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
'pýtĥöñ 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
'pýtĥöñ is awesome\n'
>>> b = unicodedata.normalize('NFD', a)
>>> b.encode('ascii', 'ignore').decode('ascii')
'python is awesome\n'
>>>
这里的标准化操作将原来的文本分解为单独的和音符。接下来的 ASCII 编码/解码只是简单的一下子丢弃掉那些字符。当然,这种方法仅仅只在最后的目标就是获取到文本对应 ACSII 表示的时候生效。
讨论
文本字符清理一个最主要的问题应该是运行的性能。一般来讲,代码越简单运行越快。对于简单的替换操作, str.replace() 方法通常是最快的,甚至在你需要多次调用的时候。比如,为了清理空白字符,你可以这样做:
def clean_spaces(s):s = s.replace('\r', '')s = s.replace('\t', ' ')s = s.replace('\f', ' ')return s
如果你去测试的话,你就会发现这种方式会比使用 translate() 或者正则表达式要快很多。
另一方面,如果你需要执行任何复杂字符对字符的重新映射或者删除操作的话,tanslate() 方法会非常的快。
从大的方面来讲,对于你的应用程序来说性能是你不得不去自己研究的东西。不幸的是,我们不可能给你建议一个特定的技术,使它能够适应所有的情况。因此实际情况中需要你自己去尝试不同的方法并评估它。
尽管本文中讨论的是文本,但是类似的技术也可以适用于字节,包括简单的替换,转换和正则表达式。
《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串相关推荐
- Python: translate()审查清理文本字符串
①凌乱的字符串如下: ②创建一个小的转换表格然后使用translate()方法 空白字符\t和\f已经被重新映射到一个空格. \r直接被删除 ③构建一个更大的表格,删除所有的和音符 转载于:https ...
- 《Python Cookbook 3rd》笔记汇总
文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素
<Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...
- Python Cookbook 3rd Edition Documentation
Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- 《Python Cookbook 3rd》笔记(5.15):打印不合法的文件名
打印不合法的文件名 问题 你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃,出现了 UnicodeEncodeError 异常和一条奇怪的消息-- surrogates n ...
最新文章
- 徐尧:如何搭建好的数据指标体系?
- 李洪强经典面试题10
- 【风控场景】互利网上数字金融典型场景: 消费金融
- [云炬创业学笔记]第二章决定成为创业者测试10
- 架构书籍推荐:Java中高级、架构师值得一读!
- sql判断邮箱是否合法_分享一个oracle身份证校验函数,判断你的身份证是否合法...
- 什么是super?如何使用super调用超类构造函数?
- java treeset排序_java TreeSet的排序之自然排序
- Servlet doGet doPost 中获取参数 中文乱码
- linux打印系统cups原理分析
- 中国移动Mas(普通短信)
- GT-suite v2016的下载和安装
- WebWork深入浅出 (转贴)http://www.blogjava.net/moxie/archive/2006/10/20/76375.html
- electron 剪贴板 截图_利用 Electron 开发快速截图工具(二)
- 计算机组成原理——如何理解计算机的运算速度以及运算速度的相关计算CPI/IPS/f/T
- 火线安全:Log4j2 史诗级漏洞波及全球6万+开源软件
- 华为 AI 芯片诞生;马云重当中国首富;微软修复数据删除 Bug | 极客头条
- 【备忘】2018年最新尚硅谷全套Java、Android、HTML5前端视频教程下载
- SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to
- python怎么找出最大数_python怎么找出最大数
热门文章
- WinCE启动界面的定制
- 初识WINCE的HIVE注册表
- 简单网络聊天程序java_基于Java实现hello/hi简单网络聊天程序
- js date转成 时间字符串_秋招快要开始了,前端笔试中的坑位-JS隐式转换问题
- 噪声调频 matlab,如何用matlab编写噪声调频干扰信号
- [你必须知道的.NET]第十四回:认识IL代码---从开始到现在
- python语言中百分号是什么意思_Python中%是什么意思?python中百分号如何使用?...
- rabbitmq导出队列_消息队列BCMQ在大云运维管理平台BCDeepWatch中的应用
- Qt:QSound无法播放.wav声音的解决办法
- 字节一面 —— List 和 Map、Set 的区别