找到多个连续的空行

时间:2015-06-22 12:18:53

标签: r

我试图将文本文件整理到它包含的文章中。通常这是通过识别每篇文章开头的模式来完成的。不幸的是,我下载文章的数据库并没有。我能找到的唯一模式是每篇文章后有3个空行。

我怎样才能确定连续三条空行? 我知道我可以找到空行:

Beginnings <- grep('^$', Lines.i)

然后看起来像

> Beginnings[1:50]
[1]   1   2   3   6   8  10  12  13  40  41  42  43  45  49  50  51  53  54  62  63  64  65  67
[24]  69  70 110 111 112 113 115 117 121 122 123 125 131 132 133 135 137 138 150 151 152 153 155
[47] 157 158 169 170

您可以看到第一篇文章在1 2 3之后开始,而下一篇文章在41 42 43之后开始。

所以我的想法是将新行表达式添加到模式

Beginnings <- grep('^$\n^$\n^$\n', Lines.i)

但这不起作用。我会很感激任何建议!

2 个答案:

答案 0 :(得分:2)

您可以尝试rle

which(inverse.rle(within.list(rle(!nzchar(v1)),
                 values[lengths<3 & values] <- FALSE)))
#[1]  3  4  5  9 10 11 12

数据

 v1 <- c('ard', 'b', '', '', '', 'rr', '', 'fr', '', '', '', '', 'gh', 'd')

答案 1 :(得分:1)

这是一个仅提取文章行的解决方案。变得比我希望的更加复杂和神秘,但我确信它有效。另外,感谢akrun提供的测试数据。

v1 <- c('ard','b','','','','rr','','fr','','','','','gh','d');
ind <- with(rle(c(rep(F,3),nzchar(v1),rep(F,3))),data.frame(start=cumsum(lengths[-length(lengths)])[values[-1]&!values[-length(values)]&lengths[-length(values)]>=3]-2,end=cumsum(lengths[-length(lengths)])[values[-length(lengths)]&!values[-1]&lengths[-1]>=3]-3));
articles <- lapply(1:nrow(ind),function(r) v1[ind[r,'start']:ind[r,'end']]);
v1;
##  [1] "ard" "b"   ""    ""    ""    "rr"  ""    "fr"  ""    ""    ""    ""    "gh"  "d"
ind;
##   start end
## 1     1   2
## 2     6   8
## 3    13  14
articles;
## [[1]]
## [1] "ard" "b"
##
## [[2]]
## [1] "rr" ""   "fr"
##
## [[3]]
## [1] "gh" "d"