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

正则表达式:替换第n次出现

发布时间:2020-12-14 02:29:35 所属栏目:百科 来源:网络整理
导读:有人知道如何找到表达式中字符串的第n个出现以及如何用正则表达式替换它? 例如,我有以下字符串 txt - "aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa" 我想用’|’代替’ – ‘的第五次出现 和“||”的第7次出现喜欢 [1] aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-
有人知道如何找到表达式中字符串的第n个出现以及如何用正则表达式替换它?

例如,我有以下字符串

txt <- "aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa"

我想用’|’代替’ – ‘的第五次出现
和“||”的第7次出现喜欢

[1] aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa

我该怎么做呢?

谢谢,
弗洛里安

(1)sub它可以在一个带有sub的正则表达式中完成:
> sub("(^(.*?-){4}.*?)-(.*?-.*?)-","1|3||",txt,perl = TRUE)
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"

(2)sub两次或这个变量调用sub两次:

> txt2 <- sub("(^(.*?-){6}.*?)-","1|",perl = TRUE)
> sub("(^(.*?-){4}.*?)-","1||",txt2,perl = TRUE)
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"

(3)sub.fun或这个变体创建一个功能sub.fun,它做一个替代.它利用gsubfn package中的fn $将n-1,pat和value替换为子参数.首先定义指示的函数,然后调用它两次.

library(gsubfn)
sub.fun <- function(x,pat,n,value) {
   fn$sub( "(^(.*?-){`n-1`}.*?)$pat","1$value",x,perl = TRUE)
}

> sub.fun(sub.fun(txt,"-",7,"||"),5,"|")
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"

(我们可以使用paste或sprintf修改sub.fun体中sub的参数,以提供基本的R解决方案,但代价是一些额外的冗长.)

这可以作为替代函数重新表述,给出这个令人愉快的顺序:

"sub.fun<-" <- sub.fun
tt <- txt # make a copy so that we preserve the input txt
sub.fun(tt,7) <- "||"
sub.fun(tt,5) <- "|"

> tt
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"

(4)gsubfn使用gsubfn package中的gsubfn,我们可以使用一个特别简单的正则表达式(它只是“ – ”),代码有一个非常简单的结构.我们通过proto方法执行替换.传递包含该方法的proto对象来代替替换字符串.这种方法的简单性源于gsubfn自动为这些方法提供计数变量的事实:

library(gsubfn) # gsubfn also pulls in proto
p <- proto(fun = function(this,x) {
     if (count == 5) return("|")
     if (count == 7) return("||")
     x
 })

> gsubfn("-",p,txt)
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"

更新:一些更正.

更新2:为(3)添加了替换函数方法.

更新3:为sub.fun添加了pat参数.

(编辑:李大同)

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

    推荐文章
      热点阅读