最近的模式匹配

时间:2014-04-02 02:03:17

标签: regex

我正在尝试识别文本中的引文。我可以使用LEX来定义和匹配引文模式。但是,这仅在引用正确时才有效。文档中往往存在很多细微的错误。

这些变化通常不是拼写错误。最常见的错误是缺少标点符号或引用元素。

问题:是否有一些有效的表驱动方法来进行近距离匹配? LEX的可能变化?或者可能是LEX编程技术(如YACC中的错误)。

1 个答案:

答案 0 :(得分:1)

恢复这个问题,因为我看不到有人回答你。

使用通常的正则表达式引擎:否

正如您可能已经发现的那样,对于大多数引擎而言,正则表达式并不是进行近距离匹配或任意单词或短语的最佳工具。当然,在最基本的层面上,\bs?he\b之类的内容会找到heshe ...但要查找interactive等单词中的所有近似匹配项,您和#39; d必须生成一个正则表达式,在单词中引入了许多排列......既无效又无效。

一个例外

我所知道的一个例外是Matthew Burnett的Python [regex][1]模块。首先,它是一个了不起的引擎,是我所知道的(使用.NET)仅支持无限宽度外观的两个引擎之一。 (JGSoft也支持它,但它与语言无关。)

此引擎具有fuzzymatch模式,可能只是执行您想要的操作。您可以提供成本等式" (最大替换数量等)。

您必须将Python连接到您的数据......可能有一个可用的模块。

这是文档的摘录。

  

正则表达式通常会尝试精确匹配,但有时候是近似的,   或者"模糊",对于那些文本存在的情况,需要匹配   搜索可能包含插入,删除或删除形式的错误   替换字符。

     

模糊正则表达式指定允许哪些类型的错误,以及   可选地,最小值和最大值或仅最大值   允许的每种类型的数量。 (您不能仅指定最小值。)

     

3种类型的错误是:

     

插入,由" i"表示删除,由" d"表示代换,   由" s"

表示      

此外," e"表示任何类型的错误。

     

正则表达式项目的模糊性在" {"和"}"后   该项目。

     

示例:

     

foo match" foo"准确

     

(?:foo){i}匹配" foo",允许插入

     

(?:foo){d}匹配" foo",允许删除

     

(?:foo){s}匹配" foo",允许替换

     

(?:foo){i,s}匹配" foo",允许插入和替换

     

(?:foo){e}匹配" foo",允许错误

     

如果指定了某种类型的错误,则表示未指定的任何类型   不允许。

     

在以下示例中,我将省略该项目并仅写入   模糊性。

     

{i <= 3}允许最多3次插入,但没有其他类型

     

{d <= 3}允许最多3次删除,但没有其他类型

     

{s <= 3}允许最多3次替换,但没有其他类型

     

{i <= 1,s <= 2}允许最多1次插入和至多2次替换,   但没有删除

     

{e <= 3}允许最多3个错误

     

{1&lt; = e&lt; = 3}允许至少1和最多3个错误

     

{i <= 2,d <= 2,e <= 3}允许最多2次插入,最多2次删除,   最多3个错误,但没有替换

     

还可以说明每种错误的成本和   允许的最高总费用。

     

示例:

     

{2i + 2d + 1s <= 4}每个插入成本2,每个删除成本为2   替代成本1,总成本不得超过4

     

{i <= 1,d <= 1,s <= 1,2i + 2d + 1s <= 4}最多1次插入,最多1次删除,   最多1次替换;每次插入费用2,每次删除费用2,   每次替换费用1,总费用不得超过4

     

你也可以使用&#34;&lt;&#34;而不是&#34;&lt; =&#34;如果你想要一个独家最低限度   或者最多:

     

{e <= 3}允许最多3个错误

     

{e <4}允许少于4个错误

     

{0      

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

     

BESTMATCH标志将使其搜索最佳匹配。

     

需要注意的其他例子:

     

regex.search(&#34;(dog){e}&#34;,&#34; cat and dog&#34;)1返回&#34; cat&#34;因为那个   火柴&#34;狗&#34;有3个错误,这是在限制内(无限制   允许的错误数量。)

     

regex.search(&#34;(dog){e&lt; = 1}&#34;,&#34; cat and dog&#34;)1返回&#34;狗&#34; (用   领先的空间),因为那匹配&#34;狗&#34;有1个错误,这是   在限制范围内(允许1个错误)。

     

regex.search(&#34;(?e)(dog){e&lt; = 1}&#34;,&#34; cat and dog&#34;)1返回&#34;狗&#34;   (没有前导空格)因为模糊搜索匹配&#34;狗&#34;同   1个错误,在限制范围内(允许1个错误),以及   (?e)然后尝试更好地适应。

     

在前两个例子中,后面有完美的匹配   字符串,但在任何情况下都不是第一个可能的匹配。

     

匹配对象有一个属性fuzz​​y_counts,它给出了总数   替换,插入和删除的数量。

     

A&#39; raw&#39;模糊匹配:   regex.fullmatch(r&#34;(?:cats | cat){e&lt; = 1}&#34;,&#34; cat&#34;)。fuzzy_counts(0,0,1)   0次置换,0次插入,1次删除。

     

如果使用ENHANCEMATCH标志,则可能更好地匹配:   regex.fullmatch(r&#34;(?e)(?:cats | cat){e&lt; = 1}&#34;,&#34; cat&#34;)。fuzzy_counts(0,0,0)   0个取代,0个插入,0个缺失。