【问题标题】:Creating fuzzy matching exceptions with Python's new regex module使用 Python 的新正则表达式模块创建模糊匹配异常
【发布时间】:2013-02-04 17:19:03
【问题描述】:

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

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>

【问题讨论】:

  • 你试过(?&lt;=[^NSEW]|^)(ST LOUIS){e&lt;=1}
  • @Some1.Kill.The.DJ:应该是一样的效果……不,你去掉了他需要的模糊匹配部分。
  • @nhahtdh 嗯..编辑了它..但我猜模糊匹配不会在环视中实现..
  • 您考虑过简单的两遍方法吗?

标签: python regex pypi-regex


【解决方案1】:

尝试否定前瞻:

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

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

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

【讨论】:

  • 啊,是的,我以为那里没有S。固定插入。
  • 哇,成功了!你的建议对我来说毫无意义。我会将其作为可接受的答案进行检查,但您(或其他人)能否解释将 S 从字符类中取出并将其置于交替中的理由(作为双 S,不少于) ?
  • @user1185790,添加了描述。
  • 啊。我什至没有想到。非常感谢你的帮助。这解释了为什么我要给出的示例按预期工作 - 因为字符异常和匹配字符串的第一个字母之间没有重复的字母。
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多