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个以上的组,还有另一种方法可以处理此问题。