首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除嵌套括号的regex

删除嵌套括号的regex
EN

Stack Overflow用户
提问于 2019-10-17 18:53:53
回答 1查看 256关注 0票数 3

如何使用R中的regex表达式替换本例中的嵌套括号:

代码语言:javascript
复制
chf <- "(Mn,Ca,Zn)5(AsO4)2((AsO3)OH)24(H2O)(OH(AsO3))(OH(AsO3)OH)"

所需的输出是

代码语言:javascript
复制
"(Mn,Ca,Zn)5(AsO4)2(AsO3OH)24(H2O)(OHAsO3)(OHAsO3OH)"

我正在尝试,但我不能排除嵌套括号中的内容。

代码语言:javascript
复制
> str_replace_all(chf,"\\((\\w+)\\)","(gone)")

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-17 19:01:04

你可以用

代码语言:javascript
复制
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组中,然后任何()都与[()]匹配。替换的是第一组的内容。

R基等价解:

代码语言:javascript
复制
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)"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58439071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档