与模式部分匹配

时间:2020-09-30 09:00:02

标签: python regex fuzzy-comparison

python中是否有一种方法可以在单词和通用模式(正则表达式)之间进行部分匹配?

目的是了解单词与给定模式(例如,单词与AB123CD格式的车牌图案之间的距离,因此两个字母,三个数字和两个字母再次由其正则表达式表示。

示例: -单词DF345EE与模式完全匹配。

-D345EE这个词的开头会再匹配一个字母

-如果“ C”是数字,则单词DFC45EE将匹配。

我一直在寻找模糊匹配,但通常用于搜索另一个表达式中的单词。

谢谢!

1 个答案:

答案 0 :(得分:0)

regex个模块支持模糊匹配,一次需要pip install regex。在下一个代码中,{e<=2}表示最多2个任何类型的错误(替换,插入,删除)。

e表示任何错误,s是替换计数,i个插入,d个删除,您可以提供类似{1<=s<=2,2<i<=4,3<=d<6}的复杂组合。

# Needs: python -m pip install regex
import regex as re

r = r'(?:[A-Z]{2}\d{3}[A-Z]{2}){e<=2}'

for s in [
    'DF345EE',
    'D345EE',
    'DFC45EE',
]:
    m = re.fullmatch(r, s)
    print(m, '\n', f'{m.fuzzy_counts[0]} substitutions, {m.fuzzy_counts[1]} insertions, {m.fuzzy_counts[2]} deletions')

输出:

<regex.Match object; span=(0, 7), match='DF345EE'>
 0 substitutions, 0 insertions, 0 deletions
<regex.Match object; span=(0, 6), match='D345EE', fuzzy_counts=(1, 0, 1)>
 1 substitutions, 0 insertions, 1 deletions
<regex.Match object; span=(0, 7), match='DFC45EE', fuzzy_counts=(1, 0, 0)>
 1 substitutions, 0 insertions, 0 deletions