2017-10-21 49 views
-1

我想除非是有否定项多达3个字来写,将确定支持方面(即'检测“证据”)代码之前检查一个,两个或三个词锻炼模式之前负回顾后或字符串

一些例子: “FISH检测没有发现BCL2易位” “FISH测试没有提供BCL2易位的证据”

我试着用回顾后,但由于它需要一个精确的长度我不能有回顾1-3个词的灵活性。

我试着用钢化点,但它给出了任何数量的单词。

我现在拥有的代码在“支持诊断”术语之前只看到一个单词。

grepl("(?<!\\bnot\\b\\s|cannot\\s|n't\\s|\\bno\\b\\s|negative\\s)(reveal|seen|show|detect|demonstrate|confirm|identif|evidence|suggest|positive|observe)(?:(?!\\bnot\\b)(?!cannot)(?!n't)(?!\\bno\\b)(?!negative for)(?!,).)*?(bcl-?2|14[q]?[;:]18)"), y, perl=TRUE,ignore.case = T)

回答

1

一个回顾后不会在这种情况下帮助,你可以做的是系统搜索的负面条款,并使用(*SKIP)(*FAIL)最多三个字丢弃您的字符串的部分:

(\\bnot\\b|\\bcannot\\b|n't\\b)(?:\\W++(?!(?1))\\w+){0,3}(*SKIP)(*F)|\\b(reveal|seen|show)\\b(?!\\snot\\b) 
+0

谢谢。非常棒!我将'(?1)'改为'(?-1)',这样引用就是相对的(即模式之前的最后一个捕获组)。我仍然试图完全理解_consuming_的概念。在这种情况下,_w + _和_w ++ _的功能是否相同? – user2387584

+0

@ user2387584:在'\ W +',占有欲量词禁止回溯,在接下来的负先行''失败,这是非常有用这里((1)?!)。通过这种方式,非捕获组失败更快。请注意,您可以得到同样的效果写作或多或少:'(?:\ w + \ B((1))\ w +?!?),因为PCRE自动possessification机制的'。 –