【问题标题】:How would I replace all but the last period with underscore?我将如何用下划线替换除最后一个句点之外的所有句点?
【发布时间】:2016-07-23 04:16:46
【问题描述】:

如何用下划线替换除最后一个句点之外的所有句点?

x <- "foo.foo.foo.foo.f"
# "foo_foo_foo_foo.f" 

【问题讨论】:

  • 谢谢@ZheyuanLi。在这种情况下确实有效,但我需要一种更灵活的方法。实际用例并不总是“.fo”。也许我在这方面提供了一个不好的例子。
  • 我遇到了一些想法,包括用于 python 的this '\.(?=[^.]*\.)' lookahead,但我得到了一个无效的正则表达式错误。
  • 只要让 Python 与 R 兼容 gsub("\\.(?=[^.]*\\.)", "_", x, perl = TRUE)
  • 谢谢,@RichardScriven。有什么理由避免使用类似 perl 的正则表达式?

标签: r


【解决方案1】:

也许这有帮助

library(stringi)
stri_replace_last(str = stri_replace_all(str = x,regex = "\\.",replacement = "\\_"),regex = "\\_",replacement = "\\.")

【讨论】:

    【解决方案2】:

    @Richard Scriven 的评论最适合我:

    gsub("\\.(?=[^.]*\\.)", "_", x, perl = TRUE)
    

    【讨论】:

      【解决方案3】:

      PCRE 选项将是

      gsub("(\\.[^.]*)$(*SKIP)(*FAIL)|\\.", "_", x, perl = TRUE)
      #[1] "foo_foo_foo_foo.f"
      

      【讨论】:

        【解决方案4】:

        一种稍微不同的方法,但应该做你需要的:

        library(stringr)
        
        x <- "foo.foo.foo.foo.f"
        
        x_split <- str_split(x, "\\.")[[1]]
        
        x_new <- paste(x_split[-length(x_split)], collapse = "_")
        x_new <- paste(x_new, x_split[length(x_split)], sep = ".")
        
        x_new
        # "foo_foo_foo_foo.f"
        

        它将始终以不同的方式处理最后一个拆分,并将泛化到句点之间的任何可能的文本。

        如果您愿意,您可能可以避免使用 stringr 包(它只是使用通用接口包装 stringi 和基本 R 字符串函数)。

        【讨论】:

          猜你喜欢
          • 2017-08-26
          • 2015-04-14
          • 2014-02-12
          • 1970-01-01
          • 2011-08-28
          • 1970-01-01
          • 1970-01-01
          • 2020-07-24
          • 1970-01-01
          相关资源
          最近更新 更多