上一篇文章: Python实用技法第27篇:编写多行模式的正则表达式
下一篇文章: Python实用技法第29篇:用正则表达式处理Unicode字符
咱们正在同Unicode字符串打交道,但须要确保全部的字符串都拥有相同的底层表示。
在Unicode中,有些特定的字符能够被表示成多种合法的代码点序列。为了说明这个问题,请看下面示例:html
str1='\u00f1' str2='n\u0303' str3='\u0303' print(str1) print(str2) print(str3) print(str1==str2) print(len(str1)) print(len(str2))
运行结果:正则表达式
ñ ñ ̃ False 1 2
这里的文本ñ是以两种形式呈现:segmentfault
对于一个比较字符串的程序来讲,同一个文本拥有多种不一样的表示形式是个大问题。为了解决这个问题,应该先将文本同一表示为规范形式,这能够经过unicodedata模块来完成。函数
实例:测试
import unicodedata str1='\u00f1' str2='n\u0303' t1=unicodedata.normalize('NFC',str1) t2=unicodedata.normalize('NFC',str2) print(t1) print(t2) print(t1==t2) print(len(t1)) print(len(t2)) print('*'*10) t3=unicodedata.normalize('NFD',str1) t4=unicodedata.normalize('NFD',str2) print(t3) print(t4) print(t3==t4) print(len(t3)) print(len(t4))
结果:编码
ñ ñ True 1 1 ********** ñ ñ True 2 2
normalize()的第一个参数指定了字符串应该如何完成规范表示。code
Python还支持NFKC和NFKD的规范表示形式,它们为处理特定类型的字符增长额额外的兼容功能。orm
实例:htm
import unicodedata str='\ufb01' print(str) print(len(str)) print('*'*10) t_nfd=unicodedata.normalize('NFD',str) t_nfkd=unicodedata.normalize('NFKD',str) t_nfc=unicodedata.normalize('NFC',str) t_nfkc=unicodedata.normalize('NFKC',str) print(t_nfd) print(len(t_nfd)) print('*'*10) print(t_nfkd) print(len(t_nfkd)) print('*'*10) print(t_nfc) print(len(t_nfc)) print('*'*10) print(t_nfkc) print(len(t_nfkc))
运行结果:ip
fi 1 ********** fi 1 ********** fi 2 ********** fi 1 ********** fi 2
对于任何须要确保以规范和一致性的方式进行处理Unicode文本的程序来讲,规范化都是重要的一部分。尤为是在处理用户输入时接收到的字符串时,此时你没法控制字符串的编码方式,那么规范化文本的表示就显得更为重要了。
在对文本进行过滤和净化时,规范化一样也占据了重要的部分。例如,假设想从某些文本中去除全部的音符标记(多是为了进行搜索或匹配):
import unicodedata str='啦啦啦\ufb01我是测试\u00f1呱呱呱n\u0303' t1=unicodedata.normalize('NFD',str) print(str) print(t1) #使用combining()函数判断指定内容是否为一个组合型字符。 result=''.join(x for x in t1 if not unicodedata.combining(x)) print(result)
运行结果:
啦啦啦fi我是测试ñ呱呱呱ñ 啦啦啦fi我是测试ñ呱呱呱ñ 啦啦啦fi我是测试n呱呱呱n
很显然,Unicode是一个庞大的主题,要得到更多相关内容,能够参考:
http://www.unicode.org/faq/no...
https://nedbatchelder.com/tex...
上一篇文章: Python实用技法第27篇:编写多行模式的正则表达式
下一篇文章: Python实用技法第29篇:用正则表达式处理Unicode字符