用正则表达式重新排列单词并添加条件空间

时间:2017-08-24 07:53:19

标签: r regex

我正在使用$scope.changeApplication = function(name) { $scope.currentApplication = name; }; 中的regex重新格式化字符串,并且我尝试删除空格,以防找不到单词。

r

结果一般都有效,但如果找不到sub('^log2\\.Ratio\\.(.)\\.(.)\\.(normalized)?.*', 'log2(\\3 Ratio \\1/\\2)', c('log2.Ratio.M.L.normalized.for','log2.Ratio.M.L.rev')) 这个词,我会得到额外的空格。

normalized

有谁知道如何让"log2(normalized Ratio M/L)" "log2( Ratio M/L)" 背后的空间有条件?

2 个答案:

答案 0 :(得分:3)

R regexes不支持条件替换字符串(如Boost,例如,您可以在Notepad ++中使用条件替换)。但是,您可以使用gsubfn并在回调部分中使用自定义替换逻辑:

library(gsubfn)
x <- c('log2.Ratio.M.L.normalized.for','log2.Ratio.M.L.rev')
rx <- '^log2\\.Ratio\\.(.)\\.(.)\\.(normalized)?.*'
gsubfn(rx, function(x, y, z) 
    ifelse(nchar(z)>0, 
    paste0("log2(",z," Ratio ",x,"/",y, ")"),
    paste0("log2(Ratio ",x,"/",y,")")),
    x)
## => [1] "log2(normalized Ratio M/L)" "log2(Ratio M/L)" 

下面:

  • ifelse(nchar(z)>0 - 检查第3组(normalized)是否匹配
  • paste0("log2(",z," Ratio ",x,"/",y, ")") - 如果是,请使用'log2(\\3 Ratio \\1/\\2)'
  • paste0("log2(Ratio ",x,"/",y,")") - 否则,请使用'log2(Ratio \\1/\\2)'替换方案。

x代表\\1y代表\\2z代表\\3

答案 1 :(得分:1)

我们可以paste log2(子字符串

paste0("log2(", trimws(sub("^log2\\.Ratio\\.(.)\\.(.)\\.*(normalized)?.*", 
          "\\3 Ratio \\1/\\2)", str1)))
#[1] "log2(normalized Ratio M/L)" "log2(Ratio M/L)"