我正在尝试在 python 中使用TRE -library 来匹配拼写错误的输入。
重要的是,它确实可以很好地处理 utf-8 编码的字符串。
一个例子:
德国首都的名字是柏林,但从发音上看是一样的,如果人们写“Bärlin”
到目前为止它正在工作,但如果非 ASCII 字符位于检测到的字符串的第一个或第二个位置,则范围和检测到的字符串本身都不正确。
# -*- coding: utf-8 -*-
import tre
def apro_match(word, list):
fz = tre.Fuzzyness(maxerr=3)
pt = tre.compile(word)
for i in l:
m = pt.search(i,fz)
if m:
print m.groups()[0],' ', m[0]
if __name__ == '__main__':
string1 = u'Berlín'.encode('utf-8')
string2 = u'Bärlin'.encode('utf-8')
string3 = u'B\xe4rlin'.encode('utf-8')
string4 = u'Berlän'.encode('utf-8')
string5 = u'London, Paris, Bärlin'.encode('utf-8')
string6 = u'äerlin'.encode('utf-8')
string7 = u'Beälin'.encode('utf-8')
l = ['Moskau', string1, string2, string3, string4, string5, string6, string7]
print '\n'*2
print "apro_match('Berlin', l)"
print "="*20
apro_match('Berlin', l)
print '\n'*2
print "apro_match('.*Berlin', l)"
print "="*20
apro_match('.*Berlin', l)
输出
apro_match('Berlin', l)
====================
(0, 7) Berlín
(1, 7) ärlin
(1, 7) ärlin
(0, 7) Berlän
(16, 22) ärlin
(1, 7) ?erlin
(0, 7) Beälin
apro_match('.*Berlin', l)
====================
(0, 7) Berlín
(0, 7) Bärlin
(0, 7) Bärlin
(0, 7) Berlän
(0, 22) London, Paris, Bärlin
(0, 7) äerlin
(0, 7) Beälin
并不是说对于正则表达式'.*Berlin'
它工作正常,而对于正则表达式'Berlin'
u'Bärlin'.encode('utf-8')
u'B\xe4rlin'.encode('utf-8')
u'äerlin'.encode('utf-8')
不工作,而
u'Berlín'.encode('utf-8')
u'Berlän'.encode('utf-8')
u'London, Paris, Bärlin'.encode('utf-8')
u'Beälin'.encode('utf-8')
按预期工作。
我的编码有什么问题吗?你知道什么诀窍吗?