从列表中提取超过n个单词的字符串

时间:2017-06-30 19:21:29

标签: r regex

我有很长的字符串列表(大约900万),如下所示:

[1] ""                                                                                                                  
[2] "Hij is op 22 oktober 2001 getrouwd"
[3] ""                                                                                                                  
[4] " Biografie test"

我需要选择每个字符串超过n个字。我一直在努力:

string <- c("", "Hij is op 22 oktober 2001 getrouwd", "", " Biografie ")
grepl("\\w{3,}", string, perl = T)
# [1] FALSE  TRUE FALSE  TRUE

在我看来,\\w{3,}应该找到n =三个或更多单词的所有内容,但由于某种原因,它也只与两个单词匹配。我还尝试了(\\s\\w\\s){3,}(\\w\\s){3,}(\\b\\.+\\b){3,}(\\w+\\b){3,}等内容。但没有任何理想的结果。

应该很简单,但无法弄清楚。任何人吗?

3 个答案:

答案 0 :(得分:3)

您可以使用包stri_count中的stringi来计算字词:

library(stringi)
string <- c("", "Hij is op 22 oktober 2001 getrouwd", "", " Biografie ")
stri_count(string,regex="\\S+")
[1] 0 7 0 1

要获得超过3个单词的字符串:

cnt <- stri_count(string,regex="\\S+")
string[cnt>=3]
[1] "Hij is op 22 oktober 2001 getrouwd"

答案 1 :(得分:1)

以下是base R选项gregexpr

lengths(gregexpr("\\w+", string)) * nzchar(string)
#[1] 0 7 0 1

数据

string <- c("", "Hij is op 22 oktober 2001 getrouwd", "", " Biografie ")

答案 2 :(得分:0)

这是一个适合您需求的简单grep:

string <- c("", "Hij is op 22 oktober 2001 getrouwd", "", " Biografie ")
grepl("(\\w+\\s){3,}", string)
#[1] FALSE  TRUE FALSE FALSE

或......

sapply(strsplit(string, "\\s"), length)>=3  
#[1] FALSE  TRUE FALSE FALSE