Индексирование строк определенной длины внутри - PullRequest
2 голосов
/ 15 мая 2019

У меня есть список имен, который выглядит следующим образом:

c("xxxxxx xx",             "xxx yyy xxxxx",       "xxx yy xxxxxx", 
  "xxxxxxx yyyyyyy xxxxx", "xxxx xxxx",           "xxx yyyyyy xxx", 
  "xxxxx yyyyy xxxxxxxx",  "xxx yyyyyyyy xxxx",   "xx xxx", 
  "xxxxx yyyyy xxxxx",     "xxxx yy xxxxxx",      "xxxxx yyyy xxx", 
  "xxxxxxx yy xxxxx",      "xxxxx yyyyyyy xxxxx", "xxxx yyyy xxxxxx", 
  "xxxxx yyyy xxxxx",      "xxxxxxxx  xxxxx",     "xxxxxx yyyyyyyy xxxxx", 
  "xxxxxx yy xxxxx",       "xxx yyyy xxxxxx")

Мне нужно извлечь (проиндексировать) все эти имена со словом из 4-6 букв.

Я знаю, что могу split каждую строку, вычислить их количество символов с помощью nchar и затем указать, какие из них имеют длину от 2 до 4. Но есть ли способ сделать это с помощью одной строки, используя регулярные выражения ?

Ожидаемый результат должен быть вектором: Числовой

[1]  1  2  3  5  6  8  9 11 12 13 15 16 20

Или логично

[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE 
[11] TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE

1 Ответ

1 голос
/ 15 мая 2019

База R
Вы можете использовать grepl

grepl("\\b\\w{4,6}\\b", my.text)
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

stringr
Вы можете использовать stringr s str_detect с

library(stringr)
str_detect(my.text, "\\b\\w{4,6}\\b")
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

В обеих версиях ключевой точкой является регулярное выражение, которое соответствует словам длиной от 4 до 6. \\b обозначает границу слова. \\w соответствует любым символам слова; [A-z0-9_]. Если вы хотите сопоставлять только буквы, вы можете использовать [A-z] или [[:alpha:]] вместо \\w.

Данные

my.text <- c("xxxxxx xx", "xxx yyy xxxxx", "xxx yy xxxxxx", "xxxxxxx yyyyyyy xxxxx", 
             "xxxx xxxx", "xxx yyyyyy xxx", "xxxxx yyyyy xxxxxxxx","xxx yyyyyyyy xxxx", "xx xxx")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...