R:如何让grep返回匹配,而不是整个string

我有什么可能是一个真正愚蠢的问题在R问题。 道歉,因为这似乎应该是如此容易 – 我显然只是失去了一些东西。

我有一个string的vector,我们称之为alice 。 一些alice打印出来如下:

 T.8EFF.SP.OT1.D5.VSVOVA#4 T.8EFF.SP.OT1.D6.LISOVA#1 T.8EFF.SP.OT1.D6.LISOVA#2 T.8EFF.SP.OT1.D6.LISOVA#3 T.8EFF.SP.OT1.D6.VSVOVA#4 T.8EFF.SP.OT1.D8.VSVOVA#3 T.8EFF.SP.OT1.D8.VSVOVA#4 T.8MEM.SP#1 T.8MEM.SP#3 T.8MEM.SP.OT1.D106.VSVOVA#2 T.8MEM.SP.OT1.D45.LISOVA#1 T.8MEM.SP.OT1.D45.LISOVA#3 

我希望grep给出在这些string中出现的D之后的数字,条件是包含“LIS”的string和空string或其他。

我希望grep能够给我一个捕获组的价值,而不是整个string。 这是我的R风味的正则expression式:

 pattern <- (?<=\\.D)([0-9]+)(?=.LIS) 

没有太复杂。 但为了得到我所追求的,而不是仅仅使用grep(pattern, alice, value = TRUE, perl = TRUE)我正在做下面这些,看起来很糟糕:

 reg.out <- regexpr( "(?<=\\.D)[0-9]+(?=.LIS)", alice, perl=TRUE ) substr(alice,reg.out,reg.out + attr(reg.out,"match.length")-1) 

现在看来,这看起来不是太难看,但是为了使这件事情变得琐碎起来,搞得一塌糊涂,实在令人尴尬。 任何人有关如何正确地去做这个指针?

奖金标志指向我的网页,解释我与$@attr访问之间的区别。

你可以做这样的事情:

 pat <- ".*\\.D([0-9]+)\\.LIS.*" sub(pat, "\\1", alice) 

如果你只想要模式匹配的alice的子集,试试这个:

 pat <- ".*\\.D([0-9]+)\\.LIS.*"; sub(pat, "\\1", alice[grepl(pat, alice)]) 

试试stringr包:

 library(stringr) str_match(alice, ".*\\.D([0-9]+)\\.LIS.*")[, 2]