用不同的替换顺序替换字符串中匹配单个模式的多个位置 [英] Sequentially replace multiple places matching single pattern in a string with different replacements

查看:28
本文介绍了用不同的替换顺序替换字符串中匹配单个模式的多个位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 stringr 包,很容易以矢量化的方式执行正则表达式替换.

Using stringr package, it is easy to perform regex replacement in a vectorized manner.

问题:我该怎么做:

替换所有单词

hello,world??your,make|[]world,hello,pos

到不同的替换,例如数量增加

to different replacements, e.g. increasing numbers

1,2??3,4|[]5,6,7

注意不能假设简单的分隔符,实际用例更复杂.

Note that simple separators cannot be assumed, the practical use case is more complicated.

stringr::str_replace_all 似乎不起作用,因为它

stringr::str_replace_all does not seem to work because it

str_replace_all(x, "(\\w+)", 1:7)

为应用于所有单词的每个替换生成一个向量,或者它有不确定和/或重复的输入条目,以便

produces a vector for each replacement applied to all words, or it has uncertain and/or duplicate input entries so that

str_replace_all(x, c("hello" = "1", "world" = "2", ...))

不会达到目的.

推荐答案

这是使用 gsubfn 的另一个想法.pre 函数在替换之前运行,fun 函数在每次替换之前运行:

Here's another idea using gsubfn. The pre function is run before the substitutions and the fun function is run for each substitution:

library(gsubfn)
x <- "hello,world??your,make|[]world,hello,pos"
p <- proto(pre = function(t) t$v <- 0, # replace all matches by 0 
           fun = function(t, x) t$v <- v + 1) # increment 1 
gsubfn("\\w+", p, x)

给出:

[1] "1,2??3,4|[]5,6,7"

这个变体会给出相同的答案,因为 gsubfn 维护了一个 count 变量用于 proto 函数:

This variation would give the same answer since gsubfn maintains a count variable for use in proto functions:

pp <- proto(fun = function(...) count)
gsubfn("\\w+", pp, x)

有关使用 count 的示例,请参阅 gsubfn 插图.

See the gsubfn vignette for examples of using count.

这篇关于用不同的替换顺序替换字符串中匹配单个模式的多个位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆