加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 在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,则只需要进行一次更改.正则表达式解决方案在三个地方有这个(如果我错过了一个,可能有四个!).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读