如何提取R中一个字符之后和另一个字符最后一次出现之前发生的所有内容?

问题描述

我有三个字符串,如下所示:

"GO:0016559~peroxisome fission,"
"GO:0006122~mitochondrial electron transport,ubiquinol to cytochrome c,GO:0006334~nucleosome assembly,"

如何提取所有出现在“~”之后和“,”之前的子字符串(它可以是字符串的结尾,也可以是 GO:.........,)?

所需的输出

"peroxisome fission"
"mitochondrial electron transport,ubiquinol to cytochrome c"
"mitochondrial electron transport,ubiquinol to cytochrome c" "nucleosome assembly"

这将在 R 中的一个通用语句中实现。

我试过用这个:

strapplyc(str,"[~](.*?)[,]",simplify = c)

(其中 str 是一个变量,它存储三个字符串中的每一个,一次一个,在循环中)

但我得到的输出是:

"peroxisome fission"
"mitochondrial electron transport"
"mitochondrial electron transport" "nucleosome assembly"

解决方法

你可以使用

(?<=~).*?(?=,(?:GO:\d+~|$))

参见regex demo详情

  • (?<=~) - ~ 字符之后的位置
  • .*? - 除换行符以外的零个或多个字符,尽可能少
  • (?=,(?:GO:\d+~|$)) - 正向前瞻,需要一个逗号,然后是 GO:、一个或多个数字和 ~ 或紧接当前位置右侧的字符串结尾。立>

查看R demo

> library(stringr)
> x <- c("GO:0016559~peroxisome fission,","GO:0006122~mitochondrial electron transport,ubiquinol to cytochrome c,GO:0006334~nucleosome assembly,")
> unlist(str_extract_all(x,"(?<=~).*?(?=,(?:GO:\\d+~|$))"))
[1] "peroxisome fission"                                         
[2] "mitochondrial electron transport,ubiquinol to cytochrome c"
[3] "mitochondrial electron transport,ubiquinol to cytochrome c"
[4] "nucleosome assembly"    
,

在基础 R 中,您可以:

sub(".*~",'',grep("~",t(read.csv(text = s,header = FALSE)),value = TRUE))
[1] "peroxisome fission"               "mitochondrial electron transport"
[3] "mitochondrial electron transport" "nucleosome assembly"