使用unicode字符集,Unicode字符串
Unicode字符串大小写折叠规范化文本匹配实用程序函数极端规范化:删除音调符号。
因为Unicode有组合字符(附加到前一个字符的音调符号和标记,它们作为一个整体打印),所以字符串比较起来很复杂。
#caf这个词可以有两种构成方式,分别是4个和5个码位,但结果完全一样:S1= caf S2= cafe u0301 S1,S2 (caf, caf) len (S1),len (S2) (4,5) S1=
解析:U 0301是组合锐重音,加在“e”后面得到“”。在Unicode标准中,像和 eu0301 这样的序列被称为“规范等价”,应用程序应该将它们视为相同的字符。但是,Python看到的是不同的代码位序列,所以它确定它们不相等。
NFC(标准化形式C)使用最少的编码比特数来形成等价的字符串;
Nf将组合字符分解为基本字符和单个组合字符;
这两种规范化方法都可以使比较行为符合预期:
Unicode数据导入正常化S1= caf #组合 e 和重音符号;s2=cafeu0301 #分解为 e 和accent len (S1),len (S2) (4,5) len (normalize (NFC ,S1)),len (normalize (NFC ,s2)) (4,4) len(normalize(NFD ,S1)),len(normalize(NFD ,s2)) (5,5) normalize(NFC ,s1)==normalize(NFC ,S2) true normalize (nfd ,S1)==normalize (nfd ,S2) true在其他两种规范化形式的首字母缩写中这两种形式都是严格的规范,对“兼容字符”有影响。
表壳折叠
大小写折叠其实就是把所有文本变成小写,再做些其他转换
。str.casefold()方法
支持此函数(Python 3.3中的新功能)。micro= name(MICRO) MICRO SIGN micro_cf=MICRO . casefold()name(MICRO _ cf)希腊文小写字母MU micro,MICRO _ cf(), 12 S.casefold()得到的结果和s.lower()一样,除了两个特殊字符:MICRO符号 会变成小写的希腊文字母“”(两者在大多数字体下看起来都一样);德语eszett(“夏普s”,)会变成“ss”。
标准化文本匹配实用函数对于大多数应用程序,NFC是最好的标准化形式。Str.casefold()应用于不区分大小写的比较。
你要
处理多语言文本
,就要nfc_equal和fold_equal函数
。# Compare normalized Unicode string 用于规范化Unicode字符串比较的实用程序函数。使用范式C,区分大小写:S1=咖啡馆 S2=咖啡馆 u0301 s1==s2 False nfc_equal(s1,s2) True nfc_equal(A , a) False使用范式C并进行大小写折叠:S3= strase S4= strasse S3==S4 False NFC _ equal(S3,s4) False fold_equal(s3,s4) True fold_equal(s1,s2) True fold_equal(A , a) True 从unicodedata导入normalize def nfccasefold()==normalize(NFC ,2)。case fold())极度标准化:移除音调符号#函数移除所有组合符号导入Unicode数据导入字符串def shave _ marks (TXT): 移除所有音调符号 norm _ TXT=Unicode data . normalize( NFD ,txt) # shaved= 。join(c for c in norm _ txt if not unicode data . combining(c))# return unicode data . normalize( NFC ,shaved)
过滤掉所有组合标志。
重组所有角色