替换R中括号内的多个字符或字符串

scr*_*rrd 5 regex r

我试图用分号替换所有括号内的逗号,但不更改括号外的任何逗号.

所以,例如:

"a, b, c (1, 2, 3), d, e (4, 5)"
Run Code Online (Sandbox Code Playgroud)

应成为:

"a, b, c (1; 2; 3), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)

我已经开始尝试使用gsub,但我很难理解/弄清楚如何识别括号内的逗号.

我会称自己是R的高级初学者,但是使用正则表达式和文本操作,一个总的菜鸟.你能提供的任何帮助都会很棒.

Wik*_*żew 6

最简单的解决方案

在所有括号均衡的情况下,最常见的解决方法是:

,(?=[^()]*\))
Run Code Online (Sandbox Code Playgroud)

请参阅IDEONE演示

正则表达式匹配......

  • , - 逗号如果......
  • (?=[^()]*\))- 后跟0或更多字符,(或者)(和[^()]*)和字面值).

替代方案

如果您需要确保替换最近的打开和关闭括号内的逗号,则使用gsubfn基于方法更安全:

a <- "a, b, c (1, 2, 3), d, e (4, 5)"
gsub(",(?=[^()]*\\))", ";", a, perl=T)
## [1] "a, b, c (1; 2; 3), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)

在这里,\(([^()]*)\)匹配(,然后是除了(和之后的0+字符),然后)将match找到的内容传递给匿名函数,其中所有,字符都用半冒号替换gsub.

如果您需要在具有未知级别深度的平衡括号内执行此替换,请使用PCRE正则表达式gsubfn:

library(gsubfn)
x <- 'a, b, c (1, 2, 3), d, e (4, 5)'
gsubfn('\\(([^()]*)\\)', function(match) gsub(',', ';', match, fixed=TRUE), x, backref=0)
## => [1] "a, b, c (1; 2; 3), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)

图案细节

x1 <- 'a, b, c (1, (2, (3, 4)), 5), d, e (4, 5)'
gsubfn('\\(((?:[^()]++|(?R))*)\\)', function(match) gsub(',', ';', match, fixed=TRUE), x1, backref=0, perl=TRUE)
## => [1] "a, b, c (1; (2; (3; 4)); 5), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)