使用Python新正则模块创建模糊匹配例外

4 投票
1 回答
1851 浏览
提问于 2025-04-17 14:43

我正在测试新的 Python regex 模块,这个模块可以进行模糊字符串匹配,使用起来让我很惊喜。不过,我在处理某些模糊匹配的例外情况时遇到了一些麻烦。下面就是一个例子。我想让 ST LOUIS 及其所有编辑距离为 1 的变体都能匹配 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>

1 个回答

4

试试使用负向前瞻:

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

(ST LOUIS){e<=1} 这个表达式可以匹配符合模糊条件的字符串。你想要防止字符串以 [NSEW] 开头。负向前瞻可以帮你做到这一点,写作 (?![NSEW])。但是你想要的字符串已经以 S 开头了,你只想排除那些在你的字符串前面再加一个 S 的情况。这样的字符串会以 SS 开头,所以这个条件被加到了负向前瞻里。

注意,如果你允许的错误数大于 1,这样的做法可能就不太奏效了。

撰写回答