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]