R:正则表达式lookaround,以获取两种模式之间的什么

时间:2015-08-06 09:03:35

标签: regex r

我有一个带字符串的向量:

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'),以及认为环视正则表达式((?= ...),(?!...),......等等)会做到这一点。但是不能让它工作!

很抱歉,如果这与其他问题类似,例如herehere)。

3 个答案:

答案 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"