我有一个带字符串的向量:
x <-c('kjsdf_class-X1(z)20_sample-318TT1X.3','kjjwer_class-Z3(z)29_sample-318TT2X.4')
我想使用正则表达式来获取子串'class-'和'_sample'之间的内容(例如x
中的'X1(z)20'和'Z3(z)29'),以及认为环视正则表达式((?= ...),(?!...),......等等)会做到这一点。但是不能让它工作!
答案 0 :(得分:3)
这与你的想法有点不同,但它会起作用。
gsub("(.*class-)|(.)|(_sample.*)", "\\2", x)
逻辑如下,你有3&#34;套&#34;字符串:
1)以.*
class-
2)字符.
3)以_sample
开头的字符和.*
从那些你想保留第二个&#34;设置&#34; \\2
。
或者另一个可能更容易理解:
gsub("(.*class-)|(_sample.*)", "", x)
以class-
结尾的任意数量的字符和字符串_sample
后跟任意数量的字符,并将其替换为NULL
字符""
答案 1 :(得分:1)
我们可以使用str_extract_all
library(stringr)
library(stringr)
unlist(str_extract_all(x, '(?<=class-)[^_]+(?=_sample)'))
#[1] "X1(z)20" "Z3(z)29"
如果字符串中有多个模式实例
,这也应该有效 x1 <- paste(x, x)
str_extract_all(x1, '(?<=class-)[^_]+(?=_sample)')
#[[1]]
#[1] "X1(z)20" "X1(z)20"
#[[2]]
#[1] "Z3(z)29" "Z3(z)29"
基本上,我们匹配两个外观((?<=class-)
和(?=_sample)
)之间的字符。我们提取的字符不是_
(基于示例),前面有class-
,后面是_sample
。
答案 2 :(得分:0)
gsub('.*-([^-]+)_.*','\\1',x)
[1] "X1(z)20" "Z3(z)29"