使用Python的新正则表达式模块创建模糊匹配异常

4
我正在测试新的Python regex模块,它允许进行模糊字符串匹配,并且我对其功能印象深刻。然而,我在进行一些带有模糊匹配的特殊情况时遇到了困难。以下是一个例子。我想要ST LOUIS和所有编辑距离为1的ST LOUIS变体都与ref匹配。但是,我想做一个例外:编辑不能包括在字母NSEW的最左边的字符左侧插入。在下面的示例中,我希望输入1-3与ref匹配,而输入4无法匹配。但是,使用下面的ref会导致所有四个输入都与其匹配。是否有了解新regex模块可行解决方法的人?
input1 = 'ST LOUIS'
input2 = 'AST LOUIS'
input3 = 'ST LOUS'
input4 = 'NST LOUIS'


ref = '([^NSEW]|(?<=^))(ST LOUIS){e<=1}'

match = regex.fullmatch(ref,input1)
match
<_regex.Match object at 0x1006c6030>
match = regex.fullmatch(ref,input2)
match
<_regex.Match object at 0x1006c6120>
match = regex.fullmatch(ref,input3)
match
<_regex.Match object at 0x1006c6030>
match = regex.fullmatch(ref,input4)
match
<_regex.Match object at 0x1006c6120>

你尝试过 (?<=[^NSEW]|^)(ST LOUIS){e<=1} 吗? - Anirudha
@Some1.Kill.The.DJ:它应该有相同的效果...不,你删除了他需要的模糊匹配部分。 - nhahtdh
@nhahtdh 嗯...我编辑了它...但我猜模糊匹配不会在环视上实现... - Anirudha
你是否考虑过使用简单的两遍扫描方法? - JDB
1个回答

4
尝试使用负向先行断言(negative lookahead)代替:
(?![NEW]|SS)(ST LOUIS){e<=1}

(ST LOUIS){e<=1}匹配满足模糊条件的字符串。 您想要防止它以[NSEW]开头。负向前瞻可以解决这个问题:(?![NSEW])。 但是,您需要的字符串已经以一个S开头,您只想排除以S开头添加到您的字符串开头的字符串。 这样的字符串将以SS开头,所以它被添加到了负向前瞻中。

请注意,如果允许错误> 1,则可能无法按预期工作。


啊,是的,我以为里面没有 S。已经修复好可以插入了。 - Qtax
哇,太棒了!但是你的建议对我来说没有意义。我会将其标记为接受的答案,但你(或其他人)能否解释一下将 S 从字符类中取出并放在替代项中的原理呢(而且是双重的 S)? - user1185790
1
@user1185790,添加了一个描述。 - Qtax
啊,我甚至没有想到这一点。非常感谢您的帮助。这解释了为什么我要提供的示例按预期工作 - 因为字符异常和匹配字符串的第一个字母之间没有重复的字母。 - user1185790

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接