如何在正则表达式中完成?
您可以使用具有内置模糊匹配技术的PyPi regex模块。这种模糊技术可让您根据正则表达式错误,允许的数目以及每种模糊匹配错误的得分来指定字符串中允许和不允许发生的事情。可以在here中找到此信息。
就正则表达式而言,您将使用以下内容(很明显,如果您在问题中指定的正则表达式是预先确定的,则可以将其串联起来;在(?:
之前加上){e}
): / p>
(?:abc.*Pickles.*efg){e}
在上述正则表达式中,{e}
允许在匹配字符串时出现任何类型的错误(删除,插入,替换)。您可以根据自己的喜好对其进行修改,下面列出了一些示例(许多示例是从我在第一段中提供的链接中复制的):
-
{d}
仅删除
-
{d,i}
仅删除和插入
-
{d,s,i}
的删除,替换或插入(与{e}
相同)-顺序无关紧要
-
{e<=3}
最多允许3个错误
-
{i<3}
允许插入少于3次
-
{1<=e<3}
允许至少1个错误,但少于3个错误
-
{1<=2,d>2}
最多允许2次插入,至少2次删除
-
{2i+d2+1s<=4}
每个插入成本2,每个删除成本2,每个替换成本1,总成本不得超过4
-
{i<=1,d<=1,s<=1,2i+2d+1s<=4}
最多插入1个,最多删除1个,最多替换1个;每个插入成本2,每个删除成本2,每个替换成本1,总成本不得超过4
其实现是什么样的?
现在您已经了解了这是什么以及它如何工作,我们可以继续进行实际的实现。以下代码在计算中使用了正则表达式模块的fuzzy_counts
,以根据其得分确定最佳字符串。我的计算将转换为百分比并按以下方式工作(您可以根据自己的喜好进行更改,并结合以上信息,更改正则表达式遇到的每种错误的得分):
# 100 * (1 - (fuzziness/length of original string))
100*(1 - (n/len(s)))
See this code working here
注意:我使用pprint
很好地显示了输出;不必要使用它,只是使结果更易于阅读。
import regex,pprint
strings = [
"abc_Pickled_efg","abc_Pickller_efg","abcd_something_Picklesefgh","efg_Pickles_abc"
]
r = r'(?:abc.*Pickles.*efg){e}'
matches = []
for i,s in enumerate(strings):
x = regex.fullmatch(r,regex.BESTMATCH) # match result
n = sum(x.fuzzy_counts) # fuzziness
c = 100*(1 - (n/len(s))) # closeness
matches.append(c)
result = sorted(zip(strings,matches),key=lambda x: x[1],reverse=True)
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(result)
结果:
[ ('abcd_something_Picklesefgh',96.15384615384616),('abc_Pickled_efg',93.33333333333333),('abc_Pickller_efg',87.5),('efg_Pickles_abc',60.0)]
本文链接:https://www.f2er.com/3148971.html