我有一个角色向量
string <- "First line\nSecond line\nthird line\n\nFourth line\nFifth line"
是从诗中创造的
1 First line
2 Second line
3 Third line
4 Fourth line
5 Fifth line
我想将第3节到第5节或第3行到第5行的向量子串(空行不计算,不应计算)。除第一行之外的每一行都可以以\n
或\n\n
开头。我不知道行的内容(当然),我不知道在第3行和第5行之间有多少空行(\n\n
)。然后我想得到
substring <- "third line\n\nFourth line\nFifth line"
然后可以呈现为
3 Third line
4 Fourth line
5 Fifth line
答案 0 :(得分:0)
您可以gsub
直到第二行的末尾,以便将第三行放到字符串的末尾。
> gsub('^.*Second line\n', '', string)
[1] "third line\n\nFourth line\nFifth line"
或以相同的方式使用strsplit
。
> strsplit(string, '^.*Second line\n')[[1]][2]
[1] "third line\n\nFourth line\nFifth line"
此外,readLines
也可以做到这一点。
> x <- readLines(textConnection(string))
> gg <- grep('third|fifth', x, ignore.case = TRUE)
> x[gg[1]:gg[2]]
[1] "third line" "" "Fourth line" "Fifth line"
答案 1 :(得分:0)
好的,我添加了一些测试,并加上我认为应该包括的行
1:-----
First line
Second line
third line (*)
<blank>
Fourth line (*)
Fifth line (*)
2:-----
<blank>
<blank>
aaaa
bbbbb
ccccc (*)
dddddd (*)
eeeeee (*)
ffffff
<blank>
3:-----
11111
<blank>
222222
<blank>
333333 (*)
<blank>
4444444 (*)
<blank>
555555 (*)
如果是这种情况,那么我认为这应该找到所有
tests<-c(
"First line\nSecond line\nthird line\n\nFourth line\nFifth line",
"\n\naaaa\nbbbbb\nccccc\ndddddd\neeeeee\nffffff\n",
"11111\n\n222222\n\n333333\n\n4444444\n\n555555"
)
gsub("^\\n*[^\\n]+\\n+[^\\n]+\\n+([^\\n]+\\n+[^\\n]+\\n+[^\\n]+)[\\s\\S]*", "\\1", tests, perl=T)
#[1] "third line\n\nFourth line\nFifth line"
#[2] "ccccc\ndddddd\neeeeee"
#[3] "333333\n\n4444444\n\n555555"
答案 2 :(得分:0)
使用strsplit
我们将字符串拆分为组。然后删除第一组中最后一个\n
的所有内容,并将其与第二组粘贴在一起:
groups <- strsplit(string, "\n\n+")[[1]]
paste(sub(".*\n", "", groups[1]), groups[2], sep = "\n\n")
,并提供:
[1] "third line\n\nFourth line\nFifth line"
注意以上总是在第一组的最后一行和第二组的第一行之间放置两个\n
,即使最初有更多。如果重要的是保留\n
的数量,然后提取分隔符seps
,并从那些选择具有多于1个字符的第1个。在最终paste
中使用它:
seps <- strsplit(string, "[^\n]+")[[1]]
sep <- seps[nchar(seps) > 1][1] # 1st multiple \n separator
groups <- strsplit(string, "\n\n+")[[1]]
paste(sub(".*\n", "", groups[1]), groups[2], sep = sep)
已修订已添加注释并略有改进。