R gsub正则表达式中的意外替换

时间:2014-12-20 11:54:35

标签: regex r gsub

我想在以下字符串中替换y,但如果它与%组合则不能。以下正则表达式适用于查找模式:

gsub(pattern = "([^%]y)", replacement = "*", "%x%xxxx_y_%y%y")
# [1] "%x%xxxx*_%y%y"

但是替换了两个字符(_y)而不是一个(y),正如我所期望的那样。 怎么了?

任何帮助表示赞赏! 安德里

3 个答案:

答案 0 :(得分:3)

1)如图所示更改正则表达式中的括号,并对替换字符串进行相应的更改,如下所示:

gsub("([^%])y", "\\1", "%x%xxxx_y_%y%y")
## [1] "%x%xxxx__%y%y"

以下是正则表达式的可视化:

([^%])y

Regular expression visualization

Debuggex Demo

2)可以使用gsubfn完全使用正则表达式完成:

library(gsubfn)
gsubfn("([^%]y)", ~ substr(x, 1, 1), "%x%xxxx_y_%y%y")
## [1] "%x%xxxx__%y%y"

这是正则表达式的可视化:

([^%]y)

Regular expression visualization

Debuggex Demo

更新:添加了可视化效果。

答案 1 :(得分:1)

你可以试试正则表达式lookbehind

 gsub("(?<=[^%])y", "", "%x%xxxx_y_%y%y", perl=TRUE)
#[1] "%x%xxxx__%y%y"

我们可以在regex101

查看
(?<=[^%])y

Regular expression visualization

答案 2 :(得分:0)

对于这种情况,您可以使用正向lookbehind或捕获组或\K放弃在最终打印时先前匹配的字符)。

> gsub("[^%]\\Ky", "*", "%x%xxxx_y_%y%y", perl=TRUE)
[1] "%x%xxxx_*_%y%y"

\K使文本与整个正则表达式匹配保持匹配。

DEMO