将 Unicode 文本标准化

问题

你正在处理 Unicode 字符串,需要确保所有字符串在底层有相同的表示。

解法

在 Unicode 中,某些字符能够用多个合法的编码表示。为了说明,考虑下面的这个例子:

>>> s1 = 'Spicy Jalape\u00f1o'
>>> s2 = 'Spicy Jalapen\u0303o'
>>> s1
'Spicy Jalapeño'
>>> s2
'Spicy Jalapeño'
>>> s1 == s2
False
>>> len(s1)
14
>>> len(s2)
15
>>>

这里的文本”Spicy Jalapeño” 使用了两种形式来表示。第一种使用整体字符”ñ”(U+00F1),第二种使用拉丁字母”n” 后面跟一个”˜” 的组合字符 (U+0303)。

在需要比较字符串的程序中使用字符的多种表示会产生问题。为了修正这个问题,你可以使用 unicodedata 模块先将文本标准化:

>>> import unicodedata
>>> t1 = unicodedata.normalize('NFC', s1)
>>> t2 = unicodedata.normalize('NFC', s2)
>>> t1 == t2
True
>>> print(ascii(t1))
'Spicy Jalape\xf1o'
>>> t3 = unicodedata.normalize('NFD', s1)
>>> t4 = unicodedata.normalize('NFD', s2)
>>> t3 == t4
True
>>> print(ascii(t3))
'Spicy Jalapen\u0303o'
>>>

normalize() 第一个参数指定字符串标准化的方式。 NFC 表示字符应该是整体组
成 (比如可能的话就使用单一编码),而 NFD 表示字符应该分解为多个组合字符表示。

Python 同样支持扩展的标准化形式 NFKC 和 NFKD,它们在处理某些字符的时候
增加了额外的兼容特性。比如:

>>> s = '\ufb01' # A single character
>>> s
' fi'
>>> unicodedata.normalize('NFD', s)
' fi'
# Notice how the combined letters are broken apart here
>>> unicodedata.normalize('NFKD', s)
'fi'
>>> unicodedata.normalize('NFKC', s)
'fi'
>>>

讨论

标准化对于任何需要以一致的方式处理 Unicode 文本的程序都是非常重要的。当处理来自用户输入的字符串而你很难去控制编码的时候尤其如此。

在清理和过滤文本的时候字符的标准化也是很重要的。比如,假设你想清除掉一些文本上面的变音符的时候 (可能是为了搜索和匹配):

>>> t1 = unicodedata.normalize('NFD', s1)
>>> ''.join(c for c in t1 if not unicodedata.combining(c))
'Spicy Jalapeno'
>>>

最后一个例子展示了 unicodedata 模块的另一个重要方面,也就是测试字符类的工具函数。 combining() 函数可以测试一个字符是否为和音字符。在这个模块中还有其他函数用于查找字符类别,测试是否为数字字符等等。

《Python Cookbook 3rd》笔记(2.9):将Unicode文本标准化相关推荐

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

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

  2. 《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串

    审查清理文本字符串 问题 一些无聊的幼稚黑客将你的网站页面中的"python"改成"pýtĥöñ",然后你想将这些字符清理掉. 解法 文本清理问题会涉及到包括文 ...

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

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

  4. 《Python cookbook》笔记二

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

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

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

  6. Python Cookbook 3rd Edition Documentation

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

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

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

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

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

  9. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

最新文章

  1. SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段
  2. 将二叉树中每一层的节点串成链表
  3. 作为开发人员,你都听产品经理的,做的累不累?
  4. 使用Spring Boot和注释支持配置Spring JMS应用程序
  5. 阿里巴巴Java开发手册——速读记录
  6. 在公司具备这三个条件,就准备好跳槽吧
  7. 如何将两个php超链接,php超链接跳转
  8. Python的web相关及Django简介
  9. 二分查找算法-java
  10. 基于android的电子词典设计_基于安卓Android电子词典移动客户端APP设计(AndroidStudio,SQLit...
  11. 修改版本名称及手机型号
  12. SCDM学习笔记(2)
  13. matlab中ones()、inf用法
  14. Modbus协议中文pdf免费下载地址
  15. 北航2021编译原理实验样例编译器-PCODE实现总结
  16. tink.js # pixi辅助插件 — 中文翻译教程
  17. 已安装内存:16.0GB(3.93GB可用):拆开机箱拔掉内存条重新安装试试。
  18. Vue、elmentUI国际化 vue-i18n项目实行简繁体切换
  19. applyTo和renderTo配置项
  20. 动力电池系统介绍(六)——预充回路介绍

热门文章

  1. vue 如何获取图片的原图尺寸_公众号封面图片尺寸是多少?如何在公众号里制作封面图?...
  2. pp助手苹果版_生日助手时间管理软件免费版下载-生日助手倒计时app苹果版下载ios...
  3. idea 创建java文件_idea创建java文件 格式不对
  4. hp服务器如何ghost系统,惠普(HP)电脑安装不了GHOST系统的解决办法
  5. arcgis中字段计算器利用python比较大小
  6. 【转】继承过程中 父类子类的 字段方法 内存分配 (非java语言)
  7. ROS 常用命令字典
  8. 软件测试中软,软件测试报告 - 中软模板.docx
  9. 【CodeForces - 298D】Fish Weight (OAE思想,思维)
  10. NYOJ-14 会场安排问题(经典贪心,区间完全不覆盖模板)