【发布时间】:2017-06-30 21:31:36
【问题描述】:
我正在使用 R 进行一些字符串处理,并且想识别具有某个词根且前面没有某个词根的另一个词的字符串。
这是一个简单的玩具示例。假设我想识别在字符串中的任何位置都没有以“dog/s”开头的单词“cat/s”的字符串。
tests = c(
"dog cat",
"dogs and cats",
"dog and cat",
"dog and fluffy cats",
"cats and dogs",
"cat and dog",
"fluffy cats and fluffy dogs")
使用这个模式,我可以拉出 确实在 cat 之前有 dog 的字符串:
pattern = "(dog(s|).*)(cat(s|))"
grep(pattern, tests, perl = TRUE, value = TRUE)
[1] "dog cat" "dogs and cats" "dog and cat" "dog and fluffy cats"
我的负面观察有问题:
neg_pattern = "(?<!dog(s|).*)(cat(s|))"
grep(neg_pattern, tests, perl = TRUE, value = TRUE)
grep 中的错误(neg_pattern,tests,perl = TRUE,value = TRUE): 无效的正则表达式
另外:警告信息: 在 grep(neg_pattern, tests, perl = TRUE, value = TRUE) : PCRE 模式编译错误 'lookbehind断言不是固定长度' 在')(猫(s|))'
我知道 .* 不是固定长度的,那么如何拒绝在“cat”之前有“dog”并由任意数量的其他单词分隔的字符串?
【问题讨论】:
-
是的,您的“负前瞻有问题”,因为它不是前瞻,而是不能具有未知长度模式的后瞻。看起来您可以通过这种方式使用 lookahead -
"^(?!.*dog.*cat).*cat" -
看起来你不能在 R 中的单个正则表达式中做你想做的事。这里也有同样的问题有一个很好的答案:stackoverflow.com/questions/3796436/…
-
@WiktorStribiżew 我试图理解我的问题的词根部分。例如,猫 vs 猫 vs 毛毛虫……我可以使用 cat(s|erpillar|) 等吗?
-
那么永远不要过于简单化。发布真实场景问题的详细信息。清醒的人一定会帮助你。
标签: r regex lookbehind