使用 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 #"
我使用了 gsub
,perl
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 ######"
是否可以使用 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 #"
我使用了 gsub
,perl
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 ######"