我正在尝试将一大组单词与一列字符串相匹配。这些词必须完全匹配。
我可以一次处理一个单词,但对于多个单词我会遇到一些问题。
x = c("red", "redish", "green", "greenish")
grepl("red|green", ignore.case=TRUE, x)
Run Code Online (Sandbox Code Playgroud)
我希望它返回“红色”和“绿色”;但不偏红或偏绿。
正则表达式让您可以使用\\b单词边界:
grepl("\\bred\\b|\\bgreen\\b", x, ignore.case = TRUE)
# [1] TRUE FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
如果您想匹配较长字符串中的单词,这将很有效:
grepl("\\bred\\b|\\bgreen\\b",
c("I want to match red", "But not Fred",
"Green yes please", "ignore wintergreen"),
ignore.case=TRUE)
# [1] TRUE FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
但是,如果您正在进行整个字符串匹配,正则表达式就太过分了,相等匹配会快得多:
tolower(x) %in% c("red", "green")
[1] TRUE FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
如果我们从以下开始,patterns = c("red|green")我们可以达到上述任一所需情况:
## use this with `%in%`
individual_words = unlist(strsplit(patterns, split = "\\|"))
## or paste on the word boundaries for regex
word_boundary_patterns = paste0("\\b", individual_words, "\\b", collapse = "|")
Run Code Online (Sandbox Code Playgroud)