gpt4 book ai didi

正则表达式 : replace the n-th occurence

转载 作者:行者123 更新时间:2023-12-04 17:01:26 28 4
gpt4 key购买 nike

有人知道如何在表达式中找到第 n 次出现的字符串以及如何用正则表达式替换它吗?

例如我有以下字符串

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

我想用 '|' 替换第 5 次出现的 '-'
以及“||”第 7 次出现“-”喜欢
[1] aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa

我该怎么做呢?

谢谢,
弗洛里安

最佳答案

(1) 子 它可以通过 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|", txt, perl = TRUE)
> sub("(^(.*?-){4}.*?)-", "\\1||", txt2, perl = TRUE)
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"

(3) sub.fun 或者这个创建函数的变体 sub.fun这是一个替代品。它利用了 fn$来自 gsubfn package替换 n-1 , pat , 和 valuesub论据。首先定义指定的函数,然后调用它两次。
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"

(我们可以使用 subsub.funpaste 主体中的参数修改为 sprintf 以给出基本的 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来自 gsubfn package我们可以使用一个特别简单的正则表达式(它只是 "-" )并且代码具有非常简单的结构。我们通过 proto 方法执行替换。包含该方法的 proto 对象代替替换字符串传递。这种方法的简单性源于 gsubfn自动生成 count此类方法可用的变量:
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:添加 pat论据 sub.fun .

关于正则表达式 : replace the n-th occurence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16789590/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com