正则表达式 – 在R中的字符串中插入字符
发布时间:2020-12-14 05:49:21 所属栏目:百科 来源:网络整理
导读:我想插入“”在字母之间(大写和小写),但不是在字母之前或之后,并将每个小写字母x替换为tt $X == 0,每个大写字母X由tt $X == 1替换,并且每个by)|(,加上一个左括号和一个闭括号围绕整个字符串,以便得到一个可以用R计算的表达式.例如,我有字符串 st - "AbC + de
我想插入“&”在字母之间(大写和小写),但不是在字母之前或之后,并将每个小写字母x替换为tt $X == 0,每个大写字母X由tt $X == 1替换,并且每个by)|(,加上一个左括号和一个闭括号围绕整个字符串,以便得到一个可以用R计算的表达式.例如,我有字符串
st <- "AbC + de + FGHIJ" 结果应如下所示: "(tt$A==1 & tt$B==0 & tt$C==1) | (tt$D==0 & tt$E==0) | (tt$F==1 & tt$G==1 & tt$H==1 & tt$I==1 & tt$J==1)" 我可以使用gsub()函数轻松完成吗? 解决方法
一堆正则表达式很少优雅,而且通常难以调试.如果元素之间没有精确的间距,则上述正则表达式解决方案会失败.
> tt("aBc+b") [1] "(tt$A==0 & tt$B==1 & tt$C==0+tt$B==0)" > tt("aBc + b") [1] "(tt$A==0 & tt$B==1 & tt$C==0) | (tt$B==0)" 有时您只需要自己拆分并处理它们.这是一个解决方案: doChar = Vectorize( function(c){ sprintf("tt$%s==%s",toupper(c),ifelse(c %in% LETTERS,"1","0")) } ) doWord = Vectorize(function(W){ cs = strsplit(W,"")[[1]] paste0("(",paste(doChar(cs),collapse=" & "),")") }) processString = function(st){ parts = strsplit(st,"+")[[1]] parts = gsub(" ","",parts) paste0(doWord(parts),collapse=" | ") } 可能有很多方法可以让它变得更好,但它的好处是更容易调试(你可以测试部件)并且看起来不像线路噪音:) 对于给定的示例字符串,它返回与tt函数相同的函数,它是regexp解决方案的函数包装器: > tt(st)==processString(st) [1] TRUE 但处理间距: > processString("aBc + deF") == processString("aBc+deF") [1] TRUE 编写在它接受的输入中有点灵活的代码总是一个好主意.您可能还注意到输出元素的tt部分只出现一次,因此如果要输出foo $A而不是tt $A,则只需要进行一次更改.正则表达式解决方案在三个地方有这个(如果我错过了一个,可能有四个!). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |