【问题标题】:How to exclude something from being replaced by gsub()如何排除某些东西被 gsub() 替换
【发布时间】:2012-04-06 03:04:40
【问题描述】:

对不起,如果这是一个愚蠢的问题,我对 R 真的很陌生。我想知道的是,有没有办法在 gsub 或类似函数中指定排除项? 我的数据看起来像这样:(15: .0234 , 12: .0151),我想用与 (a: .b , c: .d) 模式匹配的另一个项目替换前导 15。但是,只需调用 gsub 就会用新模式替换前导 15 和小数点后面的 15。简单地告诉它只替换第一次出现是行不通的,因为嵌套了很多这些模式。我在想的是从 gsub 中排除小数点后面的数字和空格 - 这甚至可能吗?

【问题讨论】:

  • 第二次@DWin 的回答,看看生成数据的代码会很有帮助。如果您要运行gsub() 的数据存储为名为@9​​87654322@ 的对象,您能否发布dput(myData) 的输出?

标签: r replace design-patterns matching gsub


【解决方案1】:

如果您在 gsub 中设置 perl=TRUE,那么您可以使用正面和负面的前瞻或后视,这可能会解决您的问题,例如模式 15(?=:) 将匹配一个 15,后跟一个冒号(但不会匹配/替换冒号)并且不会匹配任何后面没有冒号的 15。模式`(?

有关详细信息,请参阅“perl”部分中的?regex

【讨论】:

    【解决方案2】:

    我会考虑将字符串解析为(a, b, c, d, ...) 向量,而不是使用正则表达式。例如,您可以这样做:

    strsplit("15: .0234, 12: .0151", ": |, ")
    # [[1]]
    # [1] "15"     ".0234" "12"    ".0151"
    

    那么使用==match%in%[等函数进行替换应该会容易得多。

    完成后,您可以使用paste 重新组合。

    【讨论】:

      【解决方案3】:

      我可以向您展示如何仅替换“前 15 位”,但您没有提供生成测试用例的代码,在这些测试用例中您是否需要替换这些嵌套模式,所以这有点猜测。

       vec <- c('15: .0234' , '12: .0151')
       gsub("^15", "aa", vec)
      #[1] "aa: .0234" "12: .0151"
      

      正则表达式模式中的“^”符号表示字符串的开头。

      【讨论】:

        【解决方案4】:

        包含而不是排除可能更容易。

        首先,设置一些测试数据:

        test <- c("15: .0234 , 12: .0151")
        

        在字符串开头替换 15 的示例(^ 执行此操作)。

        gsub("^15","x",test)
        [1] "x: .0234 , 12: .0151"
        

        替换字符串开头的任意数字的更一般的示例。

        gsub("^([0-9]+)","x",test)
        [1] "x: .0234 , 12: .0151"
        

        删除任何数字后跟冒号 (:) 并替换为 x 和冒号的示例

        gsub("([0-9]+):","x:",test)
        [1] "x: .0234 , x: .0151"
        

        【讨论】:

          【解决方案5】:

          这对你有用吗?

          (foo <- "15: .0234 , 12: .0151")
          # "15: .0234 , 12: .0151"
          (bar <- "a: .b , c: .d")
          # "a: .b , c: .d"
          gsub("^15",bar, foo)
          # "a: .b , c: .d: .0234 , 12: .0151"
          

          如果不是,请提供一些示例数据以及一个示例对象,以显示您的最终目标是什么。一串你的数据可能是什么样子的,它是句子“简单地告诉它只替换第一次出现是行不通的,因为有很多嵌套的模式”对我来说有点不清楚。您想在字符串中查找 '15',但如果它位于结尾或以小数点开头的数字的一部分,则不查找?

          您是否阅读了帮助文件?gsub

          【讨论】:

            【解决方案6】:
            gsub("^15","a: .b , c: .d","15: .0234 , 12: .0151")
            

            这能解决您的问题吗?

            【讨论】:

              猜你喜欢
              • 2014-05-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-07
              • 2018-10-19
              • 2013-07-07
              • 2014-09-07
              • 1970-01-01
              相关资源
              最近更新 更多