我正在尝试为大型语料库编写复杂的正则表达式。但是,由于许多OR,我无法在不,不是,不应该,
中捕获“ not”我希望它分别匹配基本动词和不:例如是和不是
我已经在正则表达式https://www.regexpal.com/?fam=106183的第一行中添加了它。
任何线索,尽管它以一阶形式出现在表达式中都没有被选中的原因:[a-z] {1}'\ w
编辑: 正则表达式很长,因为它是大型语料库的一部分。我的问题是,即使我将OR放在第一位,也不会将其分开。
预先感谢
答案 0 :(得分:2)
试图用正则表达式完美地解析自然语言永远不会是“完美的”。语言包含太多的怪癖和例外。
但是,话虽如此,试图像您所做的那样明确地涵盖所有情况(“ 2个字母的小写字母”,“ 4个字母的大写字母”,“ 3个字母的倍数的单词”(? !),...注定要失败。
保持模式尽可能简单,只有在确实需要时才添加例外。
这是一种基本方法:
/n't|\b\w+(?!'t)/
这与"n't"
或“任何单词匹配,如果以"'t"
开头的最后一个字母除外”。
您可能希望在此基础上稍加改进,但它解决了您提供的用例:
为了理解为什么原始模式不起作用,让我们考虑一个最小,完整,可验证的示例:
将模式削减到:
/[a-z]?'[a-z]{1,}|[\w-]+/
考虑它如何与字符串匹配:
"weren't"
weren
与模式的[\w-]+
部分匹配。't
个字符与模式的[a-z]?'[a-z]{1,}
部分匹配。从根本上说,在此模式中使用贪婪的[\w-]+
部分将意味着它无法工作。这将始终与"n"
中的"n't"
匹配,这意味着非3个字母的单词的整体匹配会失败。