子串从第n行到第n + x行的字符向量

时间:2014-05-10 06:04:41

标签: string r substring

我有一个角色向量

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

3 个答案:

答案 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)

已修订已添加注释并略有改进。