簡體   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