【问题标题】:r - Last match of regular expression [closed]r - 正则表达式的最后一次匹配
【发布时间】:2016-05-30 05:02:33
【问题描述】:

我正在寻找一个R 模式匹配表达式,它提取列表中每个元素中最后一个完全填充的分类法。分类法始终具有相同的格式(一个字母两个下划线和一个单词(有时在方括号内)。未完全填充的分类法在两个下划线后面没有单词。

我能够构建一个在一个正则表达式构建器网站上工作的表达式
(.\_\_[A-Za-z\[\]]+)(?!.*__[A-Za-z\[\])
但没有运气使用它或将其转换为使用R 中的R 模式匹配方法@ 或任何类似的东西。这是我尝试过的一件事

clean=gsub("(.\_\_[A-Za-z[]]+)(?!.*__[A-Za-z[]])","\\1",taxonomies,perl = TRUE)

有什么建议吗? 谢谢!

taxonomies=
  list('k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__'
       ,'k__Bacteria; p__Actinobacteria; c__MB-A2-108; o__0319-7L14; f__; g__; s__'
       ,'k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales;f__Corynebacteriaceae; g__Corynebacterium; s__'
       ,'k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Rhodocyclales; f__Rhodocyclaceae; g__Methyloversatilis; s__'
       ,'k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Myxococcales; f__; g__; s__'
       ,'k__Bacteria; p__Proteobacteria; c__[Deltaproteobacteria]; o__[W123]; f__[W123]; g__[W123]; s__[W123.012.123]'
       ,'k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae')

期望的输出

[1] "f__Chitinophagaceae"  "o__0319-7L14" "g__Corynebacterium"   
[4] "g__Methyloversatilis" "o__Myxococcales"  "s__[W123.012.123]"   
[7] "f__Chitinophagaceae" 

编辑 包含所需的输出,示例代码 gsub 不起作用。

【问题讨论】:

  • 考虑显示你想要的结果。
  • 我赞同@mark-miller 的建议,并希望通过询问来提供帮助:您是否将perl=TRUE 作为参数添加到正则表达式以启用PCRE 库(通常是方言 i> 这种元语言是我们卡住的问题)?哦,也许显示R 代码会产生您尝试过的不需要的结果?我认为这将有助于我们帮助你。谢谢。
  • 感谢 Dilettant 和 @Mark-Miller,我编辑了这个问题,以便将来的用户清楚。然而,似乎下面的 akrun 已经能够解决我的问题了。
  • sapply(strsplit(unlist(taxonomies), ';'), function(i) tail(i[nchar(i)>4], 1)) 应该可以工作
  • 是的@Sotos,这段代码也有效。非常感谢!

标签: regex r taxonomy gsub


【解决方案1】:

我们可以从stringi使用stri_extract_last

library(stringi)
stri_extract_last(unlist(taxonomies), regex = '[A-Za-z]__\\[*[[:alnum:].-]+\\]*')
#[1] "f__Chitinophagaceae"  "o__0319-7L14" "g__Corynebacterium"   
#[4] "g__Methyloversatilis" "o__Myxococcales"  "s__[W123.012.123]"   
#[7] "f__Chitinophagaceae" 

在这里,我假设 OP 旨在提取 **...** 中的字符。这一定是一些格式问题,因为它没有以 BOLD 显示。

数据

taxonomies=list(
  'k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae; g__; s__'
  ,'k__Bacteria; p__Actinobacteria; c__MB-A2-108; o__0319-7L14; f__; g__; s__'
  ,'k__Bacteria; p__Actinobacteria; c__Actinobacteria; o__Actinomycetales;f__Corynebacteriaceae; g__Corynebacterium; s__'
 ,'k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Rhodocyclales; f__Rhodocyclaceae; g__Methyloversatilis; s__'
 ,'k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__Myxococcales; f__; g__; s__'
  ,'k__Bacteria; p__Proteobacteria; c__[Deltaproteobacteria]; o__[W123]; f__[W123]; g__[W123]; s__[W123.012.123]'
  ,'k__Bacteria; p__Bacteroidetes; c__[Saprospirae]; o__[Saprospirales]; f__Chitinophagaceae'
  )

【讨论】:

  • 非常感谢,这正是我所需要的。我意识到使用 bold 文本并不是表达我的问题的最佳方式,但我很高兴您能够忽略这一点。我编辑了这个问题,希望更多的人能够理解和受益。
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多