在 R 中使用 Grep 查找具有自定义“扩展”边界的单词

syr*_*yre 7 regex r

我正在寻找一个正则表达式来 grep 整个单词,包括用数字或下划线分隔的单词。\\b将数字和下划线视为单词的一部分,而不是边界。

例如,我想在“DOG MOUSE CAT”、“DOG MOUSE:CAT”和“DOG_MOUSE9CAT”以及表达式的末尾或开头捕捉鼠标,如“MOUSE9CAT”和“DOG_MOUSE” . 基本上,我正在寻找的边界是任何非大写字母字符加上行/表达式的开头和结尾(可能会遗漏\\b此处捕获的其他一些情况)。

我试过了:

"[[0-9_]\\b]MOUSE[[0-9_]\\b]"
"[[0-9_]|\\b]MOUSE[[0-9_]|\\b]"
"[$|[^A-Z]]MOUSE[^|[^A-Z]]"
"[?<=^|[^A-Z]]MOUSE[?=$|[^A-Z]]"
Run Code Online (Sandbox Code Playgroud)

他们都没有工作。

我实际上正在寻找几个词(基于一个长的值向量),所以最终结果应该看起来像

grep(paste("\\b", paste(searchwords, collapse = "\\b|\\b"), "\\b"), targettext)
Run Code Online (Sandbox Code Playgroud)

(使用不同的分隔符,因为\\b对我来说太严格了)。

(这与用户 Nick Sabbe 在此处的评论中提出的问题类似:Using grep in R to find strings as whole words (but not strings as part of words))

Wik*_*żew 5

将 PCRE 正则表达式与环视一起使用:

grep("(?<![A-Z])MOUSE(?![A-Z])", targettext, perl=TRUE)
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

该(?<![A-Z])如果单词前面带有大写ASCII字母和负前瞻负回顾后会失败的比赛(?![A-Z]),如果字之后以大写ASCII字母将失败的比赛。

要将环视应用于您拥有的所有替代方案,请使用外部分组(?:...|...)。

请参阅R 在线演示:

> targettext <- c("DOG MOUSE CAT","DOG MOUSE:CAT","DOG_MOUSE9CAT","MOUSE9CAT","DOG_MOUSE")
> searchwords <- c("MOUSE","FROG")
> grep(paste0("(?<![A-Z])(?:", paste(searchwords, collapse = "|"), ")(?![A-Z])"), targettext, perl=TRUE)
[1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)