我正在尝试将一大堆单词与一列字符串匹配。这些单词必须完全匹配。
我可以一次只用一个单词,但是对于多个单词我有一些问题。
x = c("red", "redish", "green", "greenish")
grepl("red|green", ignore.case=TRUE, x)
为此,我希望返回“红色”和“绿色”;但不会变红或变绿。
答案 0 :(得分:4)
正则表达式让您将\\b
用于单词边界:
grepl("\\bred\\b|\\bgreen\\b", x, ignore.case = TRUE)
# [1] TRUE FALSE TRUE FALSE
如果要匹配较长字符串中的单词,这将很好地工作:
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
但是,如果您要进行整个字符串匹配,则正则表达式会显得过分杀人,平等匹配会更快:
tolower(x) %in% c("red", "green")
[1] TRUE FALSE TRUE FALSE
如果我们以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 = "|")
答案 1 :(得分:1)
您还可以分别使用^
和$
指定字符串的开头和结尾:
grepl("^red$|^green$", ignore.case = T, x)