在子字符串及其首次出现之前删除字符串的一部分

时间:2018-08-22 12:52:36

标签: r regex stringr

我的文本输出如下:

str <- '=== AAAA === B§BBB === remove === remove1 === remove2 === AAAA === AAAA'

我想删除=== remove(包括)与其下一个出现的时间之间的所有子字符串:

str_2 <- '=== AAAA === B§BBB === AAAA === AAAA'

我在gsub()中尝试过:

gsub("=== B§BBB*.*=== AAAA","",str))

但是它不起作用。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

回答更新的问题

str <- '=== AAAA === B§BBB === remove === remove1 === remove2 === AAAA === AAAA'
sub("(?:\\s*===\\s*remove\\S*)+","",str)

请参见R demo onlineonline regex demo

模式匹配1+次连续出现的

  • \\s*-0个或更多空白字符
  • ===-子字符串
  • \\s*-0个或更多空白字符
  • remove-文字子字符串
  • \\S*-除空格以外的0个或多个字符

回答原始问题

您可以使用

sub("=== remove.*?(\n\\s*?=== AAAA)","\\1",str)

详细信息

  • === remove-匹配文字子串
  • .*?-任意0个以上的字符,尽可能少
  • (\n\\s*?=== AAAA)-第1组(后来在替换模式中用\1引用):换行符,0 +空格(\s*?),=== AAAA子字符串。

也可以使用替代的PCRE正则表达式:

sub("(?m)(?:(?:^|\\R)\\h*===\\h*remove)+","",str, perl=TRUE)

详细信息

  • (?m)-^现在与行首匹配
  • (?:(?:^|\\R)\\h*===\\h*remove)+-超过1次出现
    • (?:^|\\R)-行首或换行符
    • \\h*===\\h*-一个===子字符串,其中包含0+个水平空格
    • remove-文字子字符串。

答案 1 :(得分:0)

您可以使用stringi软件包。

library(stringi)
stri_replace_all_fixed(str, " === remove", "")

[1] "=== AAAA === B§BBB === AAAA === AAAA"