问题描述
我有三个字符串,如下所示:
"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"