繁体   English   中英

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

[英]Unexpected replacement in R gsub regular expression

我想在以下字符串中替换y,但如果将其与%组合,则不要替换。 以下正则表达式可以很好地找到模式:

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

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

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

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

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

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

([^%])y

正则表达式可视化

Debuggex演示

2)可以使用gsubfn完全按照您的正则表达式进行操作:

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

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

([^%]y)

正则表达式可视化

Debuggex演示

更新:添加了可视化。

你可以尝试的正则表达式lookbehind

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

我们可以在regex101上查看

(?<=[^%])y

正则表达式可视化

在这种情况下,您可以使用正向后看或捕获组或\\K这会从最终的打印中丢弃先前匹配的字符 )。

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

\\ K会将文本匹配到当前正则表达式总体之外。

DEMO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM