《Python Cookbook 3rd》笔记(2.9):将Unicode文本标准化
将 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文本标准化相关推荐
- 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素
<Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...
- 《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串
审查清理文本字符串 问题 一些无聊的幼稚黑客将你的网站页面中的"python"改成"pýtĥöñ",然后你想将这些字符清理掉. 解法 文本清理问题会涉及到包括文 ...
- 《Python Cookbook 3rd》笔记汇总
文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- 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 ...
- 《Python cookbook》笔记一
<Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...
最新文章
- SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段
- 将二叉树中每一层的节点串成链表
- 作为开发人员,你都听产品经理的,做的累不累?
- 使用Spring Boot和注释支持配置Spring JMS应用程序
- 阿里巴巴Java开发手册——速读记录
- 在公司具备这三个条件,就准备好跳槽吧
- 如何将两个php超链接,php超链接跳转
- Python的web相关及Django简介
- 二分查找算法-java
- 基于android的电子词典设计_基于安卓Android电子词典移动客户端APP设计(AndroidStudio,SQLit...
- 修改版本名称及手机型号
- SCDM学习笔记(2)
- matlab中ones()、inf用法
- Modbus协议中文pdf免费下载地址
- 北航2021编译原理实验样例编译器-PCODE实现总结
- tink.js # pixi辅助插件 — 中文翻译教程
- 已安装内存:16.0GB(3.93GB可用):拆开机箱拔掉内存条重新安装试试。
- Vue、elmentUI国际化 vue-i18n项目实行简繁体切换
- applyTo和renderTo配置项
- 动力电池系统介绍(六)——预充回路介绍
热门文章
- vue 如何获取图片的原图尺寸_公众号封面图片尺寸是多少?如何在公众号里制作封面图?...
- pp助手苹果版_生日助手时间管理软件免费版下载-生日助手倒计时app苹果版下载ios...
- idea 创建java文件_idea创建java文件 格式不对
- hp服务器如何ghost系统,惠普(HP)电脑安装不了GHOST系统的解决办法
- arcgis中字段计算器利用python比较大小
- 【转】继承过程中 父类子类的 字段方法 内存分配 (非java语言)
- ROS 常用命令字典
- 软件测试中软,软件测试报告 - 中软模板.docx
- 【CodeForces - 298D】Fish Weight (OAE思想,思维)
- NYOJ-14 会场安排问题(经典贪心,区间完全不覆盖模板)