提取具有两个以上字符并匹配模式的列表元素

时间:2016-08-09 04:31:35

标签: r list apply

我正在尝试查找列表的索引,其中一个元素与特定模式匹配,并且n个字符> 1,例如:

i = "a"
ll = list(c("a"), c("b", "abc"), c("cc", "b"), c("c", "b"), c("ac", "c"), c("a", "bc"))

我想提取ll [[2]]和ll [[5]]。这种方式让我走上了正确的道路,但并不完全是因为我只想要包含模式的元素并且有nchar> 1 ...

sapply(ll, function(x) sapply(x, function(x) nchar(x)>1 & grep(i, x)))

谢谢!

4 个答案:

答案 0 :(得分:3)

我们可以使用Filter。我们的想法是找到那些具有a元素的子元素,检查那些元素是否nchar大于1,用any包裹它们(如果每个元素中有更多元素{ {1}}元素)和list它。

Filter

或者

Filter(function(x) any(nchar(x[grep(i, x)])>1), ll)
#[[1]]
#[1] "b"   "abc"

#[[2]]
#[1] "ac" "c" 

答案 1 :(得分:2)

ll[sapply(ll, function(x) any(ifelse(nchar(x) > 1, grepl("a", x), FALSE)))]

答案 2 :(得分:1)

如果不使用XElement rootImg = XElement.Parse(xml string variable); IEnumerable<XElement> img = from el in rootImg.Descendants("ImageObject").ToList() where (string)el.Attribute("Format") != "" select el; foreach (XElement el in img) { el.Name = "img"; el.RemoveAttributes(); el.SetAttributeValue("src", ""); } ,稍微不同的方法就是更多地利用正则表达式。

  

有n个字符&gt; 1

意味着可以有一些字符,然后是“a”或“a”,然后是一些字符。正如Regex:nchar"[[:alpha:]]a | a[[:alpha:]]"表示“或” 这导致:

|

另一个更通用的选择是使用lookahaeds(~AND),如下所示:

Filter(function(x) any(grepl("[[:alpha:]]a|a[[:alpha:]]", x)), ll)

其中Filter(function(x) any(grepl("(?=[[:alpha:]]{2,})(?=a)", x, perl=TRUE)), ll) 表示至少2个字母字符= [[:alpha:]]{2,} 并且A-Za-z表示需要a。见Regular Expressions: Is there an AND operator?

修改:

您可以随时使用apaste“构建”这些正则表达式,如下所示:

sprintf

总的来说,这看起来像是

i="a"
sprintf("(?=[[:alpha:]]{2,})(?=%s)", i) # Second solution

答案 3 :(得分:0)

使用tidyverse软件包的解决方案。

library(purr)
library(stringr)
library(magrittr)

ll %>% map(function(x) x[any(nchar(x) > 1) & str_detect(x,"a")]) %>%
 Filter(length,.)