gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:33:35 26 4
gpt4 key购买 nike

如何在 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)"

最佳答案

你可以使用

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

关于正则表达式删除嵌套的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58439071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com