我在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)])