我正在尝试使用带有R的另一个向量中的元素来匹配名称。但是我不知道在R中使用grep()
时如何转义序列。
name <- "Cry River"
string <- c("Yesterday Once More","Are You happy","Cry Me A River")
grep(name, string, value = TRUE)
我希望输出为“ Cry Me A River”,但我不知道该怎么做。
答案 0 :(得分:3)
在模式中使用.*
grep("Cry.*River", string, value = TRUE)
#[1] "Cry Me A River"
或者,如果您原样获得names
并且不能更改它,则可以在空白处进行分割,并在诸如{p>
.*
以下列方式构造正则表达式的地方
grep(paste(strsplit(name, "\\s+")[[1]], collapse = ".*"), string, value = TRUE)
答案 1 :(得分:1)
这是基本的R选项,使用grepl
:
name <- "Cry River"
parts <- paste0("\\b", strsplit(name, "\\s+")[[1]], "\\b")
string <- c("Yesterday Once More","Are You happy","Cry Me A River")
result <- sapply(parts, function(x) { grepl(x, string) })
string[rowSums(result) == length(parts)]
[1] "Cry Me A River"
这里的策略是首先拆分包含各种搜索词的字符串,并为每个词生成单独的正则表达式模式。在这种情况下,我们生成:
\bCry\b and \bRiver\b
然后,我们遍历每个术语,并使用grepl
检查该术语是否出现在每个字符串中。最后,我们仅保留包含所有术语的那些匹配项。
答案 2 :(得分:0)
我们可以对分割后的字符串进行grepl
并将逻辑Reduce
的{{1}} list
转换为单个vector
向量`并提取匹配元素在“字符串”中
logical
此外,我们可以将string[Reduce(`&`, lapply(strsplit(name, " ")[[1]], grepl, string))]
#[1] "Cry Me A River"
插入strsplit
.*
sub
答案 3 :(得分:0)
这是一种使用纵梁的方法。订单重要吗?大小写重要吗?匹配整个单词是否重要?如果您只想按任何顺序匹配“哭泣”和“河川”,而不必考虑大小写。
name <- "Cry River"
string <- c("Yesterday Once More",
"Are You happy",
"Cry Me A River",
"Take me to the River or I'll Cry",
"The Cryogenic River Rag",
"Crying on the Riverside")
string[str_detect(string, pattern = regex('\\bcry\\b', ignore_case = TRUE)) &
str_detect(string, regex('\\bRiver\\b', ignore_case = TRUE))]