gpt4 book ai didi

regex - 替换R中括号内多次出现的字符或字符串

转载 作者:行者123 更新时间:2023-12-03 06:37:04 24 4
gpt4 key购买 nike

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

例如:

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

应该变成:

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

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

我称自己为 R 高级初学者,但对于正则表达式和文本操作,我完全是菜鸟。您能提供的任何帮助都会很棒。

最佳答案

最简单的解决方案

一种最常见的解决方法,可以在所有括号平衡的情况下起作用:

,(?=[^()]*\))

请参阅regex demo 。 R代码:

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

正则表达式匹配...

  • , - 逗号如果...
  • (?=[^()]*\)) - 后面跟着 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发现被传递给匿名函数,其中所有 ,使用 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 ')'

关于regex - 替换R中括号内多次出现的字符或字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31589496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com