Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 根据模式提取子字符串_Regex_R_Substr - Fatal编程技术网

Regex 根据模式提取子字符串

Regex 根据模式提取子字符串,regex,r,substr,Regex,R,Substr,假设我有一个字符串列表: string = c("G1:E001", "G2:E002", "G3:E003") 现在我希望得到一个字符串向量,它只包含冒号“:”后面的部分,即substring=c(E001,E002,E003) 在R中有没有一种方便的方法可以做到这一点?使用substr?例如使用gsub或sub gsub('.*:(.*)','\\1',string) [1] "E001" "E002" "E003" 以下是一些方法: 1)sub sub(".*

假设我有一个字符串列表:

string = c("G1:E001", "G2:E002", "G3:E003")
现在我希望得到一个字符串向量,它只包含冒号“:”后面的部分,即
substring=c(E001,E002,E003)


在R中有没有一种方便的方法可以做到这一点?使用
substr

例如使用
gsub
sub

    gsub('.*:(.*)','\\1',string)
    [1] "E001" "E002" "E003"
以下是一些方法:

1)sub

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

sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
3)读取表格

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

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

4a)子字符串/regex

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

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

Straplyc
返回括号中的部分:

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

只有当冒号之前的子字符串是唯一的(问题中的示例中就是这样)时,此项才有效。此外,它还要求分隔符为冒号(这就是问题所在)。如果使用不同的分隔符,那么我们可以先使用
sub
将其替换为冒号。例如,如果分隔符为
\uuu
,则
字符串应执行以下操作:

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


这是另一个简单的答案

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

晚到派对,但对后代来说,stringr软件包(流行的“tidyverse”软件包的一部分)现在为字符串处理提供了具有协调签名的功能:

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

# replace leading string with ""
stringr::str_remove(string = string, pattern = "^.*:")
# [1] "E001" "E002" "E003"

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

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
unglue包提供了另一种选择,对于简单的情况,不需要关于正则表达式的知识,这里我们要做:

#安装程序包(“unglue”)
图书馆(非蓝色)
字符串=c(“G1:E001”、“G2:E002”、“G3:E003”)
unglue_vec(字符串,“{x}:{y}”,var=“y”)
#>[1]“E001”“E002”“E003”
由(v0.3.0)于2019-11-06创建


更多信息:

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

library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003
库(stringr)
子串令人惊讶的是,还没有添加一个非常“基本R”的解决方案:

string=c(“G1:E001”、“G2:E002”、“G3:E003”)
regmatches(string,regexpr('E[0-9]+',string))

我在一个融化的表格中有一个变量,它以
\uu
作为分隔符,并根据@Grothendieck answer:
prefix为前缀和后缀创建了两个独立的变量。如果能看到这个惊人答案的微基准标记,那就太好了!你能解释一下这些是什么吗?*(*依此类推?我很难在一个稍有不同的设置中重新创建它…@PeterPan这捕获并返回冒号后出现的一组字符。如果要匹配的字符串更复杂,并且您希望保留在R基中,这很有效。这不是找到以E开头的第一个数字吗,而不是结肠后的一切?
string <- c("G1:E001", "G2:E002", "G3:E003")
gsub("[A-Z][1-9]:", "", string)
[1] "E001" "E002" "E003"
gsub("^.*:","", string)
string <- c("G1:E001", "G2:E002", "G3:E003")
# match string to keep
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"

# replace leading string with ""
stringr::str_remove(string = string, pattern = "^.*:")
# [1] "E001" "E002" "E003"
tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003