如何在 R 中使用 gsub 将通配符包含在返回的表达式中?

How do I include the wildcard in a returned expression with gsub in R?

我在 R 中有一个字符串:

mystring <- "2 and 4"

我想使用 gsub 在每次出现的数字后加上“小时”,这样字符串看起来像这样:

"2 hours and 4 hours"

我已经试过了,它与数字匹配,但我想要输出中返回的数字:

gsub("\d{1}", "\d{1} hours", mystring)
[1] "d{1} hours and d{1} hours"

如何在输出中包含原始数字?

我们将单词边界(\b)之前的数字(\d)捕获为一个组,并在替换中指定后面捕获的组的反向引用(\1)通过 space 然后是子串 'hours'

gsub("(\d)\b", "\1 hours", mystring)
[1] "2 hours and 4 hours"

有了stringr,我们可以在匹配上使用R函数来构造替换:

library(stringr)
str_replace_all(
  mystring,
  "\d",
  \(x) paste(x, "hours")
)
# [1] "2 hours and 4 hours"

你可以使用非消耗性的后视:

gsub("(?<=\d)", " hours", mystring, perl=TRUE)
#[1] "2 hours and 4 hours"

如果有更多数字,请另外使用边界:

gsub("(?<=\d)\b", " hours", mystring, perl=TRUE)
#[1] "2 hours and 4 hours"