根据一个模式在R中提取一个子串

假设我有一个string列表: string = c("G1:E001", "G2:E002", G3:E003) 。 现在我希望得到一个只包含冒号“:”后面的部分的string向量,即substring = c(E001,E002,E003) 。 R有没有一个方便的方法来做到这一点? 使用substr ? 谢谢!

以下是几种方法:

1)分

 sub(".*:", "", string) ## [1] "E001" "E002" "E003" 

2)strsplit

 sapply(strsplit(string, ":"), "[", 2) ## [1] "E001" "E002" "E003" 

3)read.table

 read.table(text = string, sep = ":", as.is = TRUE)$V2 ## [1] "E001" "E002" "E003" 

4)子串

这假定第二部分总是从第四个字符开始(在问题的例子中就是这种情况):

 substring(string, 4) ## [1] "E001" "E002" "E003" 

4a)子串/正则expression式

如果冒号不总是在已知的位置,我们可以通过search来修改(4):

 substring(string, regexpr(":", string) + 1) 

5)strapplyc

strapplyc返回括号内的部分:

 library(gsubfn) strapplyc(string, ":(.*)", simplify = TRUE) ## [1] "E001" "E002" "E003" 

6)read.dcf

如果冒号之前的子string是唯一的(这是问题中的例子),那么这个函数才有效。 此外,它要求分隔符是冒号(这是问题)。 如果使用不同的分隔符,那么我们可以使用sub来先用冒号replace它。 例如,如果分隔符是_那么string <- sub("_", ":", string)

 c(read.dcf(textConnection(string))) ## [1] "E001" "E002" "E003" 

添加。 strapplycread.dcf解决scheme。

注意。

inputstring被假定为:

 string <- c("G1:E001", "G2:E002", "G3:E003") 

例如使用gsubsub

  gsub('.*:(.*)','\\1',string) 1] "E001" "E002" "E003" 

这是另一个简单的答案

 gsub("^.*:","", string) 

这应该做的:

 gsub("[AZ][1-9]:", "", string) 

 [1] "E001" "E002" "E003"