我在R问题中可能是一个真正愚蠢的grep。抱歉,因为这似乎应该很简单-我显然只是想丢点东西。

我有一个字符串 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给我一些出现在这些字符串中的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访问的内容之间的区别。

最佳答案

您可以执行以下操作:

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

如果您只希望alice的子集与您的模式匹配,请尝试以下操作:
pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice[grepl(pat, alice)])

10-06 08:04
查看更多