使用Python新正则模块创建模糊匹配例外
我正在测试新的 Python regex 模块,这个模块可以进行模糊字符串匹配,使用起来让我很惊喜。不过,我在处理某些模糊匹配的例外情况时遇到了一些麻烦。下面就是一个例子。我想让 ST LOUIS
及其所有编辑距离为 1 的变体都能匹配 ref
。但是,我想对这个规则做一个例外:不能在包含字母 N
、S
、E
或 W
的最左边字符的左侧插入字符。以以下例子为例,我希望输入 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,这样的做法可能就不太奏效了。