regex 在r中使用正则表达式将括号括在由逗号分隔的字符周围

8ftvxx2r  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(82)

我想使用stringr在由逗号分隔的分组文本周围添加圆括号。因此,如果有文本由一个或多个逗号分隔,那么我希望在文本周围添加圆括号。在这种类型的字符串开始之前总是有一个“=”,在字符串之后总是有一个空格或什么都没有(向量结束)。有没有一种通用的方法可以做到这一点?下面是一个示例问题:
样品:

a <- data.frame(Rule = c("A=0 & B=Grp1,Grp2", "A=0 & B=Grp1,Grp3,Grp4 & C=1"))
a
                          Rule
1            A=0 & B=Grp1,Grp2
2 A=0 & B=Grp1,Grp3,Grp4 & C=1

所需输出:

Rule
1            A=0 & B=(Grp1,Grp2)
2 A=0 & B=(Grp1,Grp3,Grp4) & C=1
hm2xizp9

hm2xizp91#

下面是另一个可能的解决方案。我已经修改了示例输入,以显示它可以在每行处理多个“Grp”的情况下工作:

library(stringr) 
a <- data.frame(Rule = c("A=0 & B=Grp1,Grp2",
                         "A=0 & B=Grp1,Grp3,Grp4 & C=1 & D=Grp5,Grp6"))

str_replace_all(a$Rule, "=([^, &]+,[^ $]+)", "=(\\1)")
#> [1] "A=0 & B=(Grp1,Grp2)"                           
#> [2] "A=0 & B=(Grp1,Grp3,Grp4) & C=1 & D=(Grp5,Grp6)"

reprex package(v2.0.1)于2022年11月23日创建
说明:
正则表达式= "=([^, &]+,[^ $]+)", "=(\\1)"
=(以等号开头,捕获组
[^, &]+,,其中一个或多个字符不是“、"、“”和“&”,后跟逗号
[^ $]+)后跟一个或多个非“”字符或行尾字符(“$”)
=(\\1),然后替换等号并在捕获的组(例如Grp 1、Grp 2)周围添加括号

qv7cva1a

qv7cva1a2#

这应该可行:
查找:(([A-Za-z\d]+,)+[A-Za-z\d]+)
替换:($1)
说明:
[A-Za-z\d]是任意字母数字字符。
内部组查找由逗号分隔的alphanum字符组的一个或多个副本。(例如Abcd1,Abcd2,
然后,外部组查找后面没有逗号的结束字母数字组(例如Abcd3)。
将它们连接起来,然后捕获整个组。
最后要做的是替换,这是相当不言自明的。

相关问题