正则表达式删除嵌套的括号
regex to remove nested parenthesis brackets
如何使用 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)"
如何使用 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)"