我正在尝试使用正则表达式和str_replace_all
标准化一些奇数字符串数据。在某些情况下,我想使用字符集(例如[abc]
)或“通配符”(例如\d
)来定位要替换的字符,但是我不想替换那些字符集或通配符。 / p>
下面,data
是我拥有的数据类型,而clean
是我想要获取的数据:
data <- c("1ac 2b", "1 a", "1a b", "1a2b", "0")
clean <- c("1ac 2b", "1a", "1ab", "1a 2b", "0")
我一直在尝试构建如下命令:
attempt1 <- str_replace_all(data, "[abc]\\d", "[abc] \\d")
attempt2 <- str_replace_all(data, " [abc]", "[abc])
在这两次尝试中,我最终都会丢失所需的数据。
str_replace_all
的第二个参数似乎接受正则表达式,但第三个参数按字面值求值,因此我最终替换了不想替换的字符。
是否可以将通配符和字符集的值从命令的正则表达式部分传输到替换组件? 或者,是否存在完全不同的方法来解决有人会建议的这个问题?
此外:我是正则表达式的新手,如果有人给我比“通配符”更好的术语,我将相应地编辑我的帖子。
答案 0 :(得分:2)
您应该使用()
捕获要保留的字符,然后为每个组分别使用\\1
和\\2
。
您的replace
和正则表达式应为:
data <- c("1ac 2b", "1 a", "1a b", "1a2b", "0")
attempt1 <- str_replace_all(data, "([abc])(\\d)", "\\1 \\2")
attempt2 <- str_replace_all(attempt1, " ([abc])", "\\1")
> attempt2
[1] "1ac 2b" "1a" "1ab" "1a 2b" "0"
第二个替换使用attempt1
作为输入,以应用两个替换规则。您可以根据需要将两个表达式写在一行中。
str_replace_all(str_replace_all(data, "([abc])(\\d)", "\\1 \\2"), " ([abc])", "\\1")
答案 1 :(得分:0)
或者在基数R中使用gsub
。 策略:删除所有空格,然后在没有单词边界的数字之前添加空格。这应该更笼统。
gsub("(\\B\\d)", " \\1", gsub("\\s", "", x))
# [1] "1ac 2b" "1a" "1ab" "1a 2b" "0"
或包装到函数中。
mySub <- function (x) {
x <- gsub("\\s", "", x)
gsub("(\\B\\d)", " \\1", x)
}
mySub(x)
# [1] "1ac 2b" "1a" "1ab" "1a 2b" "0"
数据
x <- c("1ac 2b", "1 a", "1a b", "1a2b", "0")