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

时间:2015-07-23 13:54:18

标签: regex r

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

所以,例如:

"a, b, c (1, 2, 3), d, e (4, 5)"

应该成为:

"a, b, c (1; 2; 3), d, e (4; 5)"

我已经开始尝试使用gsub了,但是我很难理解/弄清楚如何在括号内识别这些逗号。

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

2 个答案:

答案 0 :(得分:6)

最简单的解决方案

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

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

请参阅IDEONE demo

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

  • , - 逗号if ...
  • (?=[^()]*\\)) - 后面跟着()[^()]*)以及文字)以外的0个或多个字符。

替代解决方案

如果您需要确保替换最近的打开和关闭括号内的逗号,则使用基于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)"

此处,\(([^()]*)\)匹配(,然后匹配()以及)以外的0 +字符,之后match } found被传递给匿名函数,其中所有,字符都使用gsub替换为分号。

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

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

模式详情

\(             # Open parenthesis
  (            # Start group 1
   (?:         # Start of a non-capturing group:
     [^()]++   # Any 1 or more chars other than '(' and ')'
     |         #   OR
      (?R)     # Recursively match the entire pattern
   )*          # End of the non-capturing group and repeat it zero or more times
  )            # End of Group 1 (its value will be passed to the `gsub` via `match`)
\)             # A literal ')'

答案 1 :(得分:0)

gsub("(?<=\\d),", ";", string, perl=T)