Я имею то, что является, вероятно, действительно немым 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-flavoured regexp:
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]