我有一个可能非常愚蠢的grep
在 R 问题中。抱歉,因为这看起来应该很容易 - 我显然只是错过了一些东西。
我有一个字符串向量,我们称之为 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
.
最佳答案
尝试 stringr 包:
library(stringr)
str_match(alice, ".*\\.D([0-9]+)\\.LIS.*")[, 2]
关于R:如何让 grep 返回匹配项,而不是整个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2969315/