为什么 gsubfn 会省略部分匹配项?

why does gsubfn omit part of the match?

我分析文本字符串并尝试用逗号 ,

替换圆括号 () 内的所有点 .

我找到了匹配括号内所有内容的正则表达式:

text <- "let's count (get . this . without dots) the days?"
brackets = "\((.*?)\)"
regmatches(text,regexpr(brackets,text))

给我:

[1] "(get . this . without dots)"

所述,我可以使用 gsubfn 进行更改:

library(gsubfn)
gsubfn(brackets, ~ gsub("\.", ",",x), text)

给我:

[1] "let's count get , this , without dots the days?"

而不是我想得到的:

[1] "let's count (get , this , without dots) the days?"

为什么 gsubfn 会忽略我匹配的一部分? (即括号) 有没有其他方法可以将 () 中的 . 替换为 ,

您在这里所做的是不在匹配中包含 paranthesis/brackets。即您没有捕获括号。尝试

text <- "let's count (get . this . without dots) the days?"
brackets = "(\(.*?\))" # NOTE THAT I CAPTURED THE PARANTHESIS TOO
regmatches(text,regexpr(brackets,text))
[1] "(get . this . without dots)"


library(gsubfn)
gsubfn(brackets, ~ gsub("\.", ",",x), text)
[1] "let's count (get , this , without dots) the days?"

您可以在原始正则表达式中保留任意数量的捕获组,无需修改模式,只需告诉 gsubfn 使用 整个匹配 传递 backref=0 参数:

gsubfn("\((.*?)\)", ~ gsub("\.", ",",x), text, backref=0)
[1] "let's count (get , this , without dots) the days?"

我们可以使用基数 R gsub 正向预测来解决这个问题。

gsub("\.(?=[^()]*\))", ",", text, perl = TRUE)
#[1] "let's count (get , this , without dots) the days?"

只有当它右边的第一个圆括号是右括号时,它才匹配一个点 (.)。 [^()] 匹配所有不是圆括号的东西。然后将点替换为逗号。