r - 正则表达式删除嵌套括号括号
问题描述
在此示例中,如何使用 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))*\)
则表达式是用于匹配嵌套括号的已知 PCRE 模式。找到匹配项gsubfn
后,将获取字符串并使用 . 删除所有非初始和非最终括号gsub("(^\\(|\\)$)|[()]", "\\1", x, perl=TRUE)
。在这里,将第一个 和最后一个(^\\(|\\)$)
匹配并捕获到组 1 中,然后将 any与匹配。替换的是第 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)"
推荐阅读
- python - 我在 Python 脚本中有一个 TypeError
- python - 即使在 Python 中清除 `sys.path` 后,`import` 是如何工作的?
- godot - 如何让敌人不会从平台上掉下来?
- android - Compose 更新部分区域时性能是否比 Android View 系统损失更多?
- kotlin - 如何获得双打的准确余数?
- php - 在所有博客页面的页脚和页眉中添加共同作者
- python - 无法在 python 中安装 selenium
- assembly - 在程序集中创建记录
- javascript - 尝试使文本字段在 Vuejs 中不接受表情符号时出现问题?
- php - 电报机器人回答内联查询