2017-10-21 48 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機制的'。 –