正则表达式删除嵌套的括号括号

时间:2019-10-17 18:53:53

标签: r regex parsing regex-negation chemistry

在此示例中,如何在R中使用正则表达式替换嵌套的括号:

chf <- "(Mn,Ca,Zn)5(AsO4)2((AsO3)OH)24(H2O)(OH(AsO3))(OH(AsO3)OH)"

所需的输出是

"(Mn,Ca,Zn)5(AsO4)2(AsO3OH)24(H2O)(OHAsO3)(OHAsO3OH)"

我正在尝试此操作,但无法排除嵌套方括号内的内容。

> str_replace_all(chf,"\\((\\w+)\\)","(gone)")

[1] "(Mn,Ca,Zn)5(gone)2((gone)OH)24(gone)(OH(gone))(OH(gone)OH)"

1 个答案:

答案 0 :(得分:4)

您可以使用

library(gsubfn)
chf <- "(Mn,Ca,Zn)5(AsO4)2((AsO3)OH)24(H2O)(OH(AsO3))(OH(AsO3)OH)"
gsubfn("\\((?:[^()]++|(?R))*\\)", ~ gsub("(^\\(|\\)$)|[()]", "\\1", x, perl=TRUE), chf, perl=TRUE, backref=0)
# => [1] "(Mn,Ca,Zn)5(AsO4)2(AsO3OH)24(H2O)(OHAsO3)(OHAsO3OH)"

\((?:[^()]++|(?R))*\) regex是一种已知的PCRE模式,用于匹配嵌套括号。找到匹配项后,gsubfn将使用字符串并使用gsub("(^\\(|\\)$)|[()]", "\\1", x, perl=TRUE)删除所有非初始和非最终括号。在这里,(^\\(|\\)$)匹配第一个(和最后一个)并将其捕获到组1中,然后将任何()[()]进行匹配。替换内容是第1组的内容。

R基础等效解决方案:

chf <- "(Mn,Ca,Zn)5(AsO4)2((AsO3)OH)24(H2O)(OH(AsO3))(OH(AsO3)OH)"
gre <- gregexpr("\\((?:[^()]++|(?R))*\\)", chf, perl=TRUE)
matches <- regmatches(chf, gre)
regmatches(chf, gre) <- lapply(matches, gsub, pattern="(^\\(|\\)$)|[()]", replacement="\\1")
> chf
# => "(Mn,Ca,Zn)5(AsO4)2(AsO3OH)24(H2O)(OHAsO3)(OHAsO3OH)"
相关问题