【问题标题】:Python regex's fuzzy search doesn't return all matches when using the or operatorPython regex 的模糊搜索在使用 or 运算符时不会返回所有匹配项
【发布时间】:2017-03-27 13:45:04
【问题描述】:

例如,当我使用

regex.findall(r"(?e)(mazda2 standard){e<=1}", "mazda 2 standard")

,答案照常['mazda 2 standard']。

但是当我使用时

regex.findall(r"(?e)(mazda2 standard|mazda 2){e<=1}", "mazda 2 standard")

regex.findall(r"(?e)(mazda2 standard|mazda 2){e<=1}", "mazda 2 standard", overlapped=True)

,输出根本不包含“mazda 2 标准”。如何使输出也包含“mazda 2 standard”?

【问题讨论】:

  • 您能否解释一下您期望正则表达式匹配的内容除了“mazda 2 标准”吗?我问是因为模式的其余部分在我看来在语法上无效。我很惊讶它完全匹配任何东西。
  • 嗨。在后一种情况下,我想看看 ['mazda 2', 'mazda 2 standard']。当我运行这些时没有语法错误,但如果我可能写错了,请告诉我。非常感谢。
  • 我的错,我没有注意到您使用的是regex 而不是re。所以模式应该是正确的。对此感到抱歉。

标签: python regex fuzzy-search


【解决方案1】:

PyPi regex documentation:

默认情况下,模糊匹配搜索满足给定约束的第一个匹配项。 ENHANCEMATCH 标志将导致它尝试改进它找到的匹配项的匹配度(即减少错误的数量)。

BESTMATCH 标志将使它改为搜索最佳匹配。

您的代码中包含mazda 2,因为该匹配项没有错误。

所以,使用BESTMATCH 标志(内联修饰符选项是(?b)):

>>> import regex
>>> regex.findall(r"(?be)(mazda2 standard|mazda 2){e<=1}", "mazda 2 standard")
['mazda 2 standard']
>>> 

【讨论】:

  • @RomanPerekhrest:我在 Python 2.7.9 中对其进行了测试。正则表达式库版本:2016.01.10
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2020-01-28
  • 1970-01-01
  • 2019-09-04
  • 2019-10-10
  • 1970-01-01
  • 2015-07-08
  • 2015-11-27
相关资源
最近更新 更多