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

ali*_*boy 117 regex r substr

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

G. *_*eck 202

以下是几种方法:

1)子

sub(".*:", "", string)
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)

2)strsplit

sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)

3)read.table

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

4)子串

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

substring(string, 4)
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)

4a)substring/regex

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

substring(string, regexpr(":", string) + 1)
Run Code Online (Sandbox Code Playgroud)

5)strapplyc

strapplyc 返回带括号的部分:

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

6)read.dcf

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

c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)

添加.tidyr::separateseparate解决方案.

注意.

输入post假定为:

library(dplyr)
library(tidyr)
library(purrr)

DF <- data.frame(string)
DF %>% 
  separate(string, into = c("pre", "post")) %>% 
  pull("post")
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)


ags*_*udy 23

例如使用gsubsub

    gsub('.*:(.*)','\\1',string)
    1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)

  • @PeterPan 这捕获并返回出现在冒号之后的字符组。如果要匹配的字符串更复杂并且您想保留在基本 R 中,那么这很有效。 (2认同)

Rag*_*aac 10

这是另一个简单的答案

gsub("^.*:","", string)
Run Code Online (Sandbox Code Playgroud)


CSJ*_*ell 6

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

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

  • 这不是找到第一个以 E 开头的数字,而不是冒号后面的所有数字吗? (2认同)

sin*_*dur 6

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

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)


use*_*275 5

应该这样做:

gsub("[A-Z][1-9]:", "", string)
Run Code Online (Sandbox Code Playgroud)

[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)


Moo*_*per 5

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"
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2019 年 11 月 6 日创建

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


小智 5

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

library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003
Run Code Online (Sandbox Code Playgroud)
  • (?<=:):查看冒号后面 ( :)