【问题标题】:Replace all characters except expression using gsub only仅使用 gsub 替换除表达式以外的所有字符
【发布时间】:2018-05-29 12:54:01
【问题描述】:

给定字符串:

smple_paths <- c("/path/path/path/abc22/path/path",
                 "/apath/apath/paath/abc11/something/path")

我想替换除短语abc\\d{2}之外的所有字符

尝试

gsub(
    pattern = "(?!abc\\d{2})",
    replacement = "",
    x = smple_paths,
    perl = TRUE
)

# [1] "/path/path/path/abc22/path/path"        
# [2] "/apath/apath/paath/abc11/something/path"

期望的结果

abc22
abc11

注意事项

  • 我不是在寻找基于stringr::str_extract 的解决方案或任何其他不基于gsub 的解决方案

【问题讨论】:

标签: r regex gsub


【解决方案1】:

如果你不关心 abc\d{2} 上下文,你可以使用

sub(".*(abc\\d{2}).*", "\\1", smple_paths)

请参阅 this regex demothis R demo

如果您关心上下文,您可以匹配并捕获abc + 2 位在/ 之后和/ 之前或字符串的结尾,同时使用匹配此模式之前和之后的任何文本

 sub("^.*/(abc\\d{2})(?:/.*)?$", "\\1", smple_paths)

查看R demoregex demo

详情

  • ^ - 字符串的开头(此处不需要,但为了清楚起见保留)
  • .* - 任何 0+ 个字符,尽可能多
  • / - 一个 / 字符
  • (abc\\d{2}) - 第 1 组:abc 和 2 位数字
  • (?:/.*)? - / 的可选(1 或 0)个出现,后跟尽可能多的任何 0+ 个字符
  • $ - 字符串结束。

替换模式中的\1 占位符将捕获的文本插入回结果中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-19
    • 2015-11-30
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多