首页 > 解决方案 > 修改正则表达式匹配的子串并放回

问题描述

我有一个任意字符串,比如“1a2 2a1 3a2 10a5”,我想做一个任意的数学运算,比如将某些数字加倍,然后说任何后跟“a”的数字。

我可以相对轻松地提取我想要的数字

string = "1a2 2a1 3a2 10a5"
numbers = stringr::str_extract_all(string,'[0-9]+(?=a)')[[1]]

显然,将它们加倍是微不足道的

numbers = 2*(as.integer(numbers))

但是我在将新结果放在旧位置时遇到问题。获得输出“2a2 4a1 6a2 20a5”。我觉得应该有一个函数可以完成此任务,但我能想到的只是使用记录匹配的原始索引gregexpr并将新结果手动放置在坐标中。

标签: rregex

解决方案


我们可以使用str_replace_allfromstringr来捕获数字"a",然后在它们的回调函数中将它们乘以 2。

stringr::str_replace_all(string, "\\d+(?=a)", function(m) as.integer(m) * 2)
#[1] "2a2 4a1 6a2 20a5"

推荐阅读