我分析文本字符串,并尝试用逗号.
替换圆括号()
中的所有点,
[我在方括号内找到了一个匹配正则表达式的正则表达式:
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忽略了我的比赛的一部分? (即方括号)还有其他方法可以将.
中的()
替换为,
您可以在原始正则表达式中保留所需数量的捕获组,无需修改模式,只需通过传递gsubfn
参数告诉backref=0
使用whole match:
gsubfn("\\((.*?)\\)", ~ gsub("\\.", ",",x), text, backref=0)
[1] "let's count (get , this , without dots) the days?"
您在这里所做的是不要在比赛中包括括号/括号。即您没有捕获括号。尝试
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?"
我们可以使用基数为R gsub
且正面朝前的方法解决此问题。
gsub("\\.(?=[^()]*\\))", ",", text, perl = TRUE)
#[1] "let's count (get , this , without dots) the days?"
仅当其右第一个圆括号将一个圆点封闭时,它才匹配一个圆点(.
)。 [^()]
匹配所有非圆括号。然后将点替换为逗号。