审查清理文本字符串

问题

一些无聊的幼稚黑客将你的网站页面中的“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):审查清理文本字符串相关推荐

  1. Python: translate()审查清理文本字符串

    ①凌乱的字符串如下: ②创建一个小的转换表格然后使用translate()方法 空白字符\t和\f已经被重新映射到一个空格. \r直接被删除 ③构建一个更大的表格,删除所有的和音符 转载于:https ...

  2. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  3. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  4. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  5. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  6. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  7. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  8. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  9. 《Python Cookbook 3rd》笔记(5.15):打印不合法的文件名

    打印不合法的文件名 问题 你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃,出现了 UnicodeEncodeError 异常和一条奇怪的消息-- surrogates n ...

最新文章

  1. 徐尧:如何搭建好的数据指标体系?
  2. 李洪强经典面试题10
  3. 【风控场景】互利网上数字金融典型场景: 消费金融
  4. [云炬创业学笔记]第二章决定成为创业者测试10
  5. 架构书籍推荐:Java中高级、架构师值得一读!
  6. sql判断邮箱是否合法_分享一个oracle身份证校验函数,判断你的身份证是否合法...
  7. 什么是super?如何使用super调用超类构造函数?
  8. java treeset排序_java TreeSet的排序之自然排序
  9. Servlet doGet doPost 中获取参数 中文乱码
  10. linux打印系统cups原理分析
  11. 中国移动Mas(普通短信)
  12. GT-suite v2016的下载和安装
  13. WebWork深入浅出 (转贴)http://www.blogjava.net/moxie/archive/2006/10/20/76375.html
  14. electron 剪贴板 截图_利用 Electron 开发快速截图工具(二)
  15. 计算机组成原理——如何理解计算机的运算速度以及运算速度的相关计算CPI/IPS/f/T
  16. 火线安全:Log4j2 史诗级漏洞波及全球6万+开源软件
  17. 华为 AI 芯片诞生;马云重当中国首富;微软修复数据删除 Bug | 极客头条
  18. 【备忘】2018年最新尚硅谷全套Java、Android、HTML5前端视频教程下载
  19. SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to
  20. python怎么找出最大数_python怎么找出最大数

热门文章

  1. WinCE启动界面的定制
  2. 初识WINCE的HIVE注册表
  3. 简单网络聊天程序java_基于Java实现hello/hi简单网络聊天程序
  4. js date转成 时间字符串_秋招快要开始了,前端笔试中的坑位-JS隐式转换问题
  5. 噪声调频 matlab,如何用matlab编写噪声调频干扰信号
  6. [你必须知道的.NET]第十四回:认识IL代码---从开始到现在
  7. python语言中百分号是什么意思_Python中%是什么意思?python中百分号如何使用?...
  8. rabbitmq导出队列_消息队列BCMQ在大云运维管理平台BCDeepWatch中的应用
  9. Qt:QSound无法播放.wav声音的解决办法
  10. 字节一面 —— List 和 Map、Set 的区别