使用 gsub 替换具有相同字符数的匹配项

Using gsub to replace matches with same number of characters

是否可以使用 gsub 将匹配的每个字符替换为另一个字符?我已经阅读并尝试了很多问题的解决方案但没有成功,因为它们非常针对所使用的示例。有些看起来很有前途但最终没有让我成功的是

replace-pattern-with-one-space-per-character-in-perl

我正在寻找的是执行以下操作的一般方法。我有一个正则表达式列表,我将它们组合成一个

形式的正则表达式
pattern <- "[0-9]{3,}|[a-z]{3,}|..."

给定一个字符串,例如

x <- "1234 abc 12 a 123456"

我想从 gsub 取回匹配的每个字符替换为 #

的字符串
"#### ### 12 a ######"

而不是

"# # 12 a #"

我使用了 gsubperl arg 设置为 TRUE,并尝试使用在线正则表达式工具,使用 \G 之类的东西和环视,但我想不通。

我正在寻找使用 gsub 执行此操作的方法(我意识到用其他方式很容易做到)的原因是将其用作审查某些单词和匹配项(例如日期)的方法、phone 个号码和 dplyr 个管道中的电子邮件地址。我的函数工作正常,除了任何替换都是固定的,我想替换每个匹配的字符,而不是每个匹配的子字符串。

filter_words <- function(.data, .words, .replacement, ...) {
  .data %>% dplyr::mutate(
    dplyr::across(
      c(...),
      ~ gsub(
          paste0("\b", .words, collapse = "|\b"),
          .replacement, .,
          ignore.case = TRUE, perl = TRUE
      )
    )
  )
}

我确实尝试过使用一个名为 mgsub 的包来实现它提供的 mgsub_censor 功能。这确实有效,但它比我已有的慢了几个数量级,所以对于大型数据集来说并不实用。

我确实尝试创建一个自定义 gsub 函数,该函数能够接受一个函数(可以 return 一个由与每个匹配项相同数量的字符组成的字符串)作为替换参数。它对单个字符串工作正常,但在管道中工作失败。

您可以在 str_replace_all 中传递一个函数并使用 strrep 重复 # 符号 n 次。

x <- "1234 abc 12 a 123456"
pattern <- "[0-9]{3,}|[a-z]{3,}"

stringr::str_replace_all(x, pattern, function(m) strrep('#', nchar(m)))
#[1] "#### ### 12 a ######"