正则表达式:替换第n次出现
有人知道如何找到表达式中字符串的第n个出现以及如何用正则表达式替换它?
例如,我有以下字符串 txt <- "aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa" 我想用’|’代替’ – ‘的第五次出现 [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参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |