为什么gsubfn忽略部分匹配内容?

问题描述 投票:2回答:3

我分析文本字符串,并尝试用逗号.替换圆括号()中的所有点,

[我在方括号内找到了一个匹配正则表达式的正则表达式:

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

给我:

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

here所述,我可以使用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忽略了我的比赛的一部分? (即方括号)还有其他方法可以将.中的()替换为,

r regex gsub gsubfn
3个回答
3
投票

您可以在原始正则表达式中保留所需数量的捕获组,无需修改模式,只需通过传递gsubfn参数告诉backref=0使用whole match

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

4
投票

您在这里所做的是不要在比赛中包括括号/括号。即您没有捕获括号。尝试

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?"

2
投票

我们可以使用基数为R gsub且正面朝前的方法解决此问题。

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

仅当其右第一个圆括号将一个圆点封闭时,它才匹配一个圆点(.)。 [^()]匹配所有非圆括号。然后将点替换为逗号。

© www.soinside.com 2019 - 2024. All rights reserved.