4

我正在测试新的 python正则表达式模块,它允许模糊字符串匹配,到目前为止,它的功能给我留下了深刻的印象。但是,我在使用模糊匹配处理某些例外时遇到了麻烦。以下是一个很好的例子。我想和1 的编辑距离内的ST LOUIS所有变体相匹配。但是,我想对这条规则做一个例外:编辑不能包括在包含字母、、或的最左侧字符的左侧插入。在以下示例中,我希望输入 1 - 3 与 ref 匹配,而输入 4 则失败。但是,使用以下ST LOUISrefNSEWref使其匹配所有四个输入。熟悉新的正则表达式模块的人是否知道可能的解决方法?

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>
4

1 回答 1

4

尝试否定前瞻:

(?![NEW]|SS)(ST LOUIS){e<=1}

(ST LOUIS){e<=1}匹配满足放置在其上的模糊条件的字符串。您想阻止它以[NSEW]. 负前瞻可以为您做到这一点(?![NSEW])。但是您想要的字符串S已经以 a 开头,您只想排除以S添加到字符串开头的字符串。这样的字符串会以 开头SS,这就是为什么它被添加到负前瞻中。

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

于 2013-02-04T17:36:07.113 回答