我正在寻找一个正则表达式来 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))
将 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)