根据模式提取R中的子字符串

时间:2013-06-20 14:06:24

标签: regex r substr

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

9 个答案:

答案 0 :(得分:169)

以下是一些方法:

1)sub

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)子串

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

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

4a)substring / regex

如果冒号并非总是处于已知位置,我们可以通过搜索来修改(4):

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

5)strapplyc

strapplyc返回带括号的部分:

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

6)read.dcf

这个只有在冒号之前的子串是唯一的(它们在问题中的示例中)才有效。它还要求分隔符是冒号(它在问题中)。如果使用了不同的分隔符,那么我们可以先使用sub替换冒号。例如,如果分隔符为_,则为string <- sub("_", ":", string)

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

溶液。 strapplycread.dcf解决方案。

请注意

输入string假定为:

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

答案 1 :(得分:22)

例如,使用gsubsub

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

答案 2 :(得分:9)

这是另一个简单的答案

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

答案 3 :(得分:4)

这应该做:

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

给出

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

答案 4 :(得分:4)

晚了聚会,但为了后代, stringr 软件包(流行的“ tidyverse”软件包套件的一部分)现在为函数提供了带有统一签名的函数,用于字符串处理:

string <- c("G1:E001", "G2:E002", "G3:E003")
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"

答案 5 :(得分:2)

提取子字符串的另一种方法

library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003
  • (?<=:):在冒号(:)后面

答案 6 :(得分:1)

如果您使用的是data.table,那么tstrsplit()是很自然的选择:

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"

答案 7 :(得分:0)

unglue 软件包提供了一种替代方法,对于简单的情况,不需要有关正则表达式的知识,我们可以这样做:

# install.packages("unglue")
library(unglue)
string = c("G1:E001", "G2:E002", "G3:E003")
unglue_vec(string,"{x}:{y}", var = "y")
#> [1] "E001" "E002" "E003"

reprex package(v0.3.0)于2019-11-06创建

更多信息:https://github.com/moodymudskipper/unglue/blob/master/README.md

答案 8 :(得分:0)

令人惊讶的是,尚未添加非常“基础的 R”解决方案:

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

regmatches(string, regexpr('E[0-9]+', string))