R:how, чтобы заставить grep возвращать соответствие, а не целую строку

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

50
задан Mike Dewar 3 June 2010 в 08:58
поделиться

2 ответа

Вы можете сделать что-то вроде этого:

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

Если вам нужно только подмножество alice , которому соответствует ваш шаблон, попробуйте следующее:

pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice[grepl(pat, alice)])
37
ответ дан 7 November 2019 в 10:55
поделиться

Попробуйте пакет stringr:

library(stringr)
str_match(alice, ".*\\.D([0-9]+)\\.LIS.*")[, 2]
53
ответ дан 7 November 2019 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: