R 如何在不考虑序列的情况下确定字符串是否包含某些字符?
我试图使用另一个向量中的元素与R匹配一个名称,但我不知道在R中使用grep时如何转义序列 我希望输出是一条河,但我不知道怎么做。在模式中使用。*R 如何在不考虑序列的情况下确定字符串是否包含某些字符?,r,string,R,String,我试图使用另一个向量中的元素与R匹配一个名称,但我不知道在R中使用grep时如何转义序列 我希望输出是一条河,但我不知道怎么做。在模式中使用。* grep("Cry.*River", string, value = TRUE) #[1] "Cry Me A River" 或者,如果您得到的是原样的名称,并且无法更改,则可以在空白处拆分,并在以下单词之间插入。* grep(paste(strsplit(name, "\\s+")[[1]], collapse = ".*"), string, v
grep("Cry.*River", string, value = TRUE)
#[1] "Cry Me A River"
或者,如果您得到的是原样的名称,并且无法更改,则可以在空白处拆分,并在以下单词之间插入。*
grep(paste(strsplit(name, "\\s+")[[1]], collapse = ".*"), string, value = TRUE)
其中正则表达式按以下方式构造
strsplit(name, "\\s+")[[1]]
#[1] "Cry" "River"
paste(strsplit(name, "\\s+")[[1]], collapse = ".*")
#[1] "Cry.*River"
下面是一个使用grepl的基本R选项: 然后,我们迭代每个术语,并使用grepl检查该术语是否出现在每个字符串中。最后,我们只保留包含所有术语的匹配项。我们可以对拆分的字符串执行grepl,并将逻辑向量列表缩减为单个logicalvector`并提取'string'中的匹配元素
string[Reduce(`&`, lapply(strsplit(name, " ")[[1]], grepl, string))]
#[1] "Cry Me A River"
另外,我们可以插入带有子元素的.*来代替strsplit
这里有一个使用stringr的方法。秩序重要吗?案例重要吗?匹配整个单词很重要吗。如果你只想以任何顺序匹配“Cry”和“River”,而不关心这个案例
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))]
非常感谢。另外,如果上面的字符串实际上是数据帧中的一列,那么我必须首先转换它吗?@staifmis108不需要。您可以使用df$column_name而不是string,其中df是数据帧的名称,column_name是列的名称。
\bCry\b and \bRiver\b
string[Reduce(`&`, lapply(strsplit(name, " ")[[1]], grepl, string))]
#[1] "Cry Me A River"
grep(sub(" ", ".*", name), string, value = TRUE)
#[1] "Cry Me A River"
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))]