如何在不考虑序列的情况下查找字符串是否包含某些字符?

时间:2019-07-01 04:34:00

标签: r string

我正在尝试使用带有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”,但我不知道该怎么做。

4 个答案:

答案 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))]