在字符串中通过位置标识的特定事件之前,删除所有内容

时间:2018-08-22 17:02:21

标签: r regex string stringi

我有一个看起来像a的字符串。

我想删除模式=== test,包括===的倒数第二次发生之前的所有内容。

a <- "=== test : {abc}
      === test : {abc}
      === test : {abc}
      === test : {aUs*} 
      === dce
      === test : {12abc}
      === abc
      === test : {abc}
      === test : {dfg}"

result <- "test : {abc}
           === test : {dfg}"

我尝试过:

gsub(".*=== test", "", a)

如何将第二个索引设置为倒数第二个?

谢谢

2 个答案:

答案 0 :(得分:0)

下面应该可以工作。我将数据分割成一个由换行符\\n隔开的向量(附加的反斜杠用于“转义”特殊字符),然后使用grep查找模式^=== test的所有出现情况^表示字符串应以此开头。

数据

a <- "=== test : {abc}
      === test : {abc}
      === test : {abc}
      === test : {aUs*} 
      === dce
      === test : {12abc}
      === abc
      === test : {abc}
      === test : {dfg}"

代码

# convert to a vector for ease
b <- unlist(strsplit(a, '\\n'))

# get indices for each occurrence of the pattern  
indices <- grep('^=== test', b)

# we only need the last two occurrences 
n <- length(indices)

res <- b[indices[(n-1):n]]

# res is a vector with two entries, to get it back to a single entry 
# same as the original data, we use paste(.., collapse = '\\n')
result <- paste(res, collapse = '\\n')

输出

> result
[1] "=== test : {abc}\\n=== test : {dfg}"

答案 1 :(得分:0)

我们可以使用strsplit按换行符分割并选择最后两个元素。将它们paste一起使用,并在开始时使用sub删除===

sub("^=== ", "", paste(tail(strsplit(a, split = "\\n")[[1]], 2), collapse = "\n"))
# [1] "test : {abc}\n=== test : {dfg}"