我试图用分号替换所有括号内的逗号,但不更改括号外的任何逗号。
所以,例如:
"a, b, c (1, 2, 3), d, e (4, 5)"
应该成为:
"a, b, c (1; 2; 3), d, e (4; 5)"
我已经开始尝试使用gsub了,但是我很难理解/弄清楚如何在括号内识别这些逗号。
我会称自己为R的高级初学者,但是使用正则表达式和文本操作,总是noob。你能提供的任何帮助都会很棒。
答案 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)