Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用正则表达式重新排列单词并添加空格条件_R_Regex - Fatal编程技术网

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

R 使用正则表达式重新排列单词并添加空格条件,r,regex,R,Regex,我正在用r中的regex重新格式化字符串,并试图删除空格以防找不到单词 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)"

我正在用
r
中的
regex
重新格式化字符串,并试图删除空格以防找不到单词

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)"

有人知道如何使
\\3
后面的空格有条件吗?

我们可以
粘贴
log2(
子字符串

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

R正则表达式不支持条件替换字符串(如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)" 
库(gsubfn)
x[1]“log2(标准化比率M/L)”“log2(比率M/L)”
在这里:

  • ifelse(nchar(z)>0
    -检查组3(
    标准化的
    )是否匹配
  • paste0(“log2(“,z,“Ratio”,x,“/”,y,”)”)
    -如果是,使用
    “log2(\\3 Ratio\\1/\\2)”
  • paste0(“log2(比率),x,“/”,y,”)”
    -否则,使用
    'log2(比率\\1/\\2)
    替换方案

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

这让我想到了使用
sub('\\\(','(',…
但我不知道
trimws
函数…谢谢!好的,这实际上就是我所想的,正则表达式不能处理这些条件字符串。您的解决方案看起来很好,但对于我的问题可能有点过头了:-)但是我一定会记住
gsubfn
。@drmariod:一旦你需要操作
\1
\2
\3
,你就必须依赖
gsubfn
。另外,如果你有更大的字符串,没有任何东西可以被共享,
gsubfn
也会有很大帮助。akrun的方法是一种变通方法,我的方法是一种一般解决方案。你是对的,所以我将“已解决”标志改为“你的答案”,我想akrun不会因为失去一些分数而不高兴:-)我认为在我的解决方案中,我仍然会使用嵌套的
sub
命令,因为它更容易阅读。但是我说,
gsubfn
非常棒,并且提供了很多可能性。它实际上也可以处理9个以上的变量吗?好吧,请接受最适合您的答案。我没有发表评论来说服您使用它ange your mind,这只是我的意见。至于反向引用的数量,不,只支持默认的1到9。如果您定义更多,则捕获组的ID仅输出。如果您想使用9个以上的组,还有另一种方法可以处理此问题。