2014-01-03 2 views
5

У меня есть вектор из трех символов, и я пытаюсь написать команду, которая найдет, какие элементы вектора имеют конкретную букву в качестве второго символа.Совпадение частичных строк с grep и регулярными выражениями

В качестве примера, скажем, у меня есть этот вектор 3-буквенных жал ...

example = c("AWA","WOO","AZW","WWP") 

я могу использовать grepl и glob2rx для поиска строк с W в качестве первого или последнего символа.

> grepl(glob2rx("W*"),example) 
[1] FALSE TRUE FALSE TRUE 

> grepl(glob2rx("*W"),example) 
[1] FALSE FALSE TRUE FALSE 

Однако, я не получаю правильный результат, когда я пытаюсь использовать его с glob2rx(*W*)

> grepl(glob2rx("*W*"),example) 
[1] TRUE TRUE TRUE TRUE 

Я уверен, что мое понимание регулярных выражений не хватает, но это кажется довольно простой проблемой и я не могу найти решение. Мне бы очень понравилась помощь!

Для дальнейшего использования, мне также очень хотелось бы знать, могу ли я распространить это на случай, когда у меня есть более длинные строки. Скажем, у меня есть строки длиной 5 символов, можно ли использовать grepl таким образом, чтобы возвращать строки, где W - третий символ?

ответ

8

я бы подумал, что это регулярное выражение так:

> grepl("^.W",example) 
[1] TRUE FALSE FALSE TRUE 

Если вы хотите конкретную позиции, которая предуказанная затем:

> grepl("^.{1}W",example) 
[1] TRUE FALSE FALSE TRUE 

Это позволит программные вычисления:

pos= 2 
n=pos-1 
grepl(paste0("^.{",n,"}W"),example) 
[1] TRUE FALSE FALSE TRUE 
4

Если у вас есть строки 3-символов и нужно проверить второй символ, вы можете просто проверить соответствующую подстроку, а не с помощью регулярных выражений:

example = c("AWA","WOO","AZW","WWP") 
substr(example, 2, 2) == "W" 
# [1] TRUE FALSE FALSE TRUE 
+0

Идеально, и это может быть легко применено и к строкам другой длины. Благодаря! Если у кого-то есть аналогичная проблема и требуется эквивалентная команда команды grep, это будет ... > который (substr (пример, 2, 2) == "W") [1] 1 4 – Starcalibre

Смежные вопросы