我正在尝试查找列表的索引,其中一个元素与特定模式匹配,并且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)))
谢谢!
答案 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?
修改:
您可以随时使用a
或paste
“构建”这些正则表达式,如下所示:
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,.)