r - R : remove specific pattern in multiple places without removing text in between instances of the pattern 中的字符串操作

标签 r regex string

在 R 中,我正在尝试编写适用于字符串模式的任何改编的代码。一个字符串的例子是:

string <- "y ~ 1 + a + (b | c) + (d^2) + e + (1 | f) + g"

我只想删除包含“(, |, )”模式的部分,例如:

(b | c) 和 (1 | f)

并留下:
"y ~ 1 + a + (d^2) + e + g"

请注意,字符可能会改变值(例如,“b”可能会变成“1”,“c”可能会变成“预测器”),我希望代码仍然有效。字符串也不需要空格,它也可以是“y~1+a+(b|c)+(d^2)+e+(1|f)+g”或其空格/无空格的任意组合.字符的顺序也可以更改为“y~1+a+(b|c)+e+(1|f)+(d^2)+g”。

我曾尝试使用基本 R 字符串操作函数(gsub 和 sub)通过使用模式的变体来搜索“(,|,)”的模式,例如:
"\\(.*\\|.*\\)"
"\\(.*\\|"
"\\(.+\\|.+\\)"
"\\|.+\\)"

以及许多用于查找此模式并将其替换为空白的 stringr 函数。但是,同时使用基础 R 和 stringr 时,我这样做会删除所有内容,例如:
gsub("\\(.*\\|.*\\)", "", string)

产生:
"y ~ 1 + a +  + g"


gsub("\\(.*\\|", "", string)

产生:
"y ~ 1 + a +  f) + g"

我还尝试过使用 str_locate 函数,但由于有多组括号,因此在使用该函数时遇到了问题,并且我只想要带有“|”的实例的位置它们之间。

任何帮助是极大的赞赏。

最佳答案

1) gsubfn 定义一个返回空字符串或其输入的函数,具体取决于输入是否具有 |与否并运行 gsubfn用它。 gsubfn 就像 gsub除了替换字符串可以是一个函数,它将匹配项作为输入并将其替换为函数的输出。

library(gsubfn)

pick <- function(x) if (grepl("|", x, fixed = TRUE)) "" else trimws(x)
gsubfn("[+] *[(].*?[)]", pick, string, perl = TRUE)
## [1] "y ~ 1 + a  + (d^2) + e  + g"

2) 基础 R 将输入拆分为术语,并在没有 | 的情况下 grep 出那些。然后使用 reformulate 把剩下的东西放在一起.
s <- trimws(grep("\\|", strsplit(string, "[~+]")[[1]], invert = TRUE, value = TRUE))
reformulate(format(s[-1]), s[1])
## y ~ 1 + a + (d^2) + e + g

3) 获取条款 这也仅使用基数 R 但首先将字符串转换为表示公式的表达式并使用 getTerms 解析它在此 SO 帖子中找到:Terms of a sum in a R expression然后按照(2)进行。
p <- parse(text = string)[[1]]
s <- grep("\\|", getTerms(p[[3]]), value = TRUE, invert = TRUE)
reformulate(s, p[[2]])
## y ~ 1 + a + (d^2) + e + g

关于r - R : remove specific pattern in multiple places without removing text in between instances of the pattern 中的字符串操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62455830/

相关文章:

sql - R 是否提供比 tryCatch() 更干净的东西来安全地进行 SQL 查询?

r - 在 ggplot 中使用四个图在图表下方添加标题

r - 仅对时间序列中的工作日进行子集化

regex - vim 将 regex 组的所有匹配项拖入寄存器

python - 如何使用python从以列中的数字开头的字符串中提取数字

R 枢轴示例

regex - 使用 awk 计算条件的出现次数

c++ - 您可以将多少 "data"放入字符串中?

C 为什么 for 循环没有达到预期的迭代次数?

c++ - 添加字符串和文字 (C++)