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

时间:2010-06-03 19:58:14

标签: r grep

我在R问题中可能是一个非常愚蠢的grep。道歉,因为这看起来应该很容易 - 我显然只是遗漏了一些东西。

我有一个字符串向量,我们称之为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给出一些出现在这些字符串中的D之后的数字,条件是包含“LIS”的字符串和空字符串或其他东西。

我希望grep会返回捕获组的值,而不是整个字符串。这是我的R风格的正则表达式:

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访问的内容之间的区别。

2 个答案:

答案 0 :(得分:53)

尝试使用stringr包:

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

答案 1 :(得分:37)

您可以这样做:

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

如果您只想要模式匹配的alice子集,请尝试以下操作:

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