R:在字符串向量

时间:2018-05-20 03:21:20

标签: r grep

我有以下文件名列表:

files.list <- c("Fasted DWeib NoCmaxW.xlsx", "Fed DWeib NoCmaxW.xlsx", "Fasted SWeib NoCmaxW.xlsx", "Fed SWeib NoCmaxW.xlsx", "Fasted DWeib Cmax10.xlsx", "Fed DWeib Cmax10.xlsx", "Fasted SWeib Cmax10.xlsx", "Fed SWeib Cmax10.xlsx")

我想确定哪些文件包含以下子字符串:

toMatch <- c("Fasted", "DWeib NoCmaxW")

我发现的例子经常引用以下用法:

grep(paste(toMatch, collapse = "|"), files.list, value=TRUE)

然而,这会带来四种可能性:

[1] "Fasted DWeib NoCmaxW.xlsx" "Fed DWeib NoCmaxW.xlsx"    "Fasted SWeib NoCmaxW.xlsx"
[4] "Fasted DWeib Cmax10.xlsx"  "Fasted SWeib Cmax10.xlsx" 

我想要包含toMatch元素的文件名(即&#34;禁食&#34;和&#34; DWeib NoCmaxW&#34;)。只有一个文件满足该要求(files.list [1])。我假设&#34; |&#34;在粘贴命令中可能是一个逻辑OR,所以我尝试了#34;&amp;&#34;,但这并没有解决我的问题。

有人可以帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:4)

我们可以使用&

i1 <- grepl(toMatch[1], files.list) & grepl(toMatch[2], files.list)

如果“匹配”中有多个元素,请使用lapplyReduce将这些元素循环到具有vector的单个逻辑&

i1 <- Reduce(`&`, lapply(toMatch, grepl, x = files.list))
files.list[i1]
#[1] "Fasted DWeib NoCmaxW.xlsx"

也可以使用.*折叠元素,即匹配&#39; toMatch&#39;的第一个单词。接下来是单词边界(\\b),然后是一些字符(.*)和另一个单词边界(\\b),然后是第二个单词“toMatch&#39;”。在这个例子中,它有效。也许最好在开头和结尾添加单词边界(这个例子不需要)

pat1 <- paste(toMatch, collapse= "\\b.*\\b")
grep(pat1, files.list, value = TRUE)
#[1] "Fasted DWeib NoCmaxW.xlsx"

但是,这将在&#39; toMatch&#39;中以相同的单词顺序查找匹配项。如果,如果子序列的顺序相反并且想要匹配它们,则按相反顺序创建pattern,然后使用|

折叠
pat2 <- paste(rev(toMatch), collapse="\\b.*\\b")
pat <- paste(pat1, pat2, sep="|")
grep(pat, files.list, value = TRUE) 
#[1] "Fasted DWeib NoCmaxW.xlsx"