正则表达式不分开(不是)

时间:2018-11-26 20:09:58

标签: regex

我正在尝试为大型语料库编写复杂的正则表达式。但是,由于许多OR,我无法在不,不是,不应该,

中捕获“ not”

我希望它分别匹配基本动词:例如不是

我已经在正则表达式https://www.regexpal.com/?fam=106183的第一行中添加了它。

任何线索,尽管它以一阶形式出现在表达式中都没有被选中的原因:[a-z] {1}'\ w

编辑: 正则表达式很长,因为它是大型语料库的一部分。我的问题是,即使我将OR放在第一位,也不会将其分开。

预先感谢

1 个答案:

答案 0 :(得分:2)

试图用正则表达式完美地解析自然语言永远不会是“完美的”。语言包含太多的怪癖和例外。

但是,话虽如此,试图像您所做的那样明确地涵盖所有情况(“ 2个字母的小写字母”,“ 4个字母的大写字母”,“ 3个字母的倍数的单词”(? !),...注定要失败。

保持模式尽可能简单,只有在确实需要时才添加例外。

这是一种基本方法:

/n't|\b\w+(?!'t)/

这与"n't"或“任何单词匹配,如果以"'t"开头的最后一个字母除外”。

您可能希望在此基础上稍加改进,但它解决了您提供的用例:

Demo


为了理解为什么原始模式不起作用,让我们考虑一个最小,完整,可验证的示例:

将模式削减到:

/[a-z]?'[a-z]{1,}|[\w-]+/

考虑它如何与字符串匹配:

"weren't"
  • 首先,字符weren与模式的[\w-]+部分匹配。
  • 然后,'t个字符与模式的[a-z]?'[a-z]{1,}部分匹配。

从根本上说,在此模式中使用贪婪的[\w-]+部分将意味着它无法工作。这将始终与"n"中的"n't"匹配,这意味着非3个字母的单词的整体匹配会失败。