索引内部具有特定长度的字符串

时间:2019-05-15 16:09:42

标签: r regex

我有一个看起来像这样的名字列表:

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 个答案:

答案 0 :(得分:1)

基本R
您可以使用grepl

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

Stringr
您可以将stringr的{​​{1}}与

一起使用
str_detect

在两个版本中,关键点都是匹配长度为4到6的单词的正则表达式。library(stringr) str_detect(my.text, "\\b\\w{4,6}\\b") # [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE 表示单词边界。 \\b匹配任何单词字符; \\w。如果只想匹配字母,则可以使用[A-z0-9_][A-z]代替[[:alpha:]]

数据

\\w