删除括号之前但在 R 中前面的逗号之后的字符

Remove characters prior to parentheses but after the preceding comma in R

我有以下数据框:

df<-c("red apples,(golden,red delicious),bananas,(cavendish,lady finger),golden pears","yellow pineapples,red tomatoes,(roma,vine),orange carrots")

我想删除逗号和括号前面的单词,这样我的输出将产生:

[1] "golden,red delicious),cavendish,lady finger),golden pears" "yellow pineapples,roma,vine),orange carrots"

理想情况下,右括号也会被删除。但我可以使用 gsub.

管理删除

我觉得回顾可能有用,但似乎无法正确编码。

谢谢!

编辑:我修改了数据框,所以我要删除的单词是一个包含两个单词的字符串。

我们可以使用base Rgsub来删除字符。我们匹配一个单词 (\w+) 后跟 space (\s+) 后跟单词 (\w+) 逗号 (,) 和 (,替换为空白 ("")

gsub("\w+\s+\w+,\(", "", df)
#[1] "golden,red delicious),cavendish,lady finger),golden pears" 
#[2] "yellow pineapples,roma,vine),orange carrots"  

或者如果 , 是检查单词的模式之一,我们可以用不是 ,

的字符创建模式
gsub("[^,]+,\(", "", df)
#[1] "golden,red delicious),cavendish,lady finger),golden pears" 
#[2] "yellow pineapples,roma,vine),orange carrots" 

使用 tidyverse 包 stringr,我能够通过管道分隔的两个函数调用使您的数据按照您希望的方式显示。管道来自 magrittr 包,它加载了 dplyr and/or tidyverse.

我使用 stringr::str_replace_all 进行了两次替换,删除了您想要删除的单词。请注意此函数中多个替换的语法。

    str_replace_all( c( "first string to get rid of" = "string to replace it with", "second string to get rid of" = "second replacement string")

您可能会发现先组合所有“去掉字符串”再组合替换字符串更直观,但 c() 中的每个元素都是要替换的字符串(在引号中)连接到它的用“=”替换(也在引号中)。这些 replaced=replacement 对中的每一个都用逗号分隔。

使用 str_replace,我首先使用正则表达式 ",[a-z ]+,\\(" 取出所有以“,”开头并以“,)”结尾的文本它指的是逗号,后跟任意数量的小写字母和 spaces(允许检测具有多个单词的块)后跟“,(”。注意“(”的转义。如果你认为那里可能是您会使用 [a-zA-Z ] 的大写字母。无论哪种情况,请注意“]”之前的 space。

因为您想去掉单词,而不是前面的逗号,所以我将删除的文本替换为“,”。

这不会删除第一个字符串中的“red apples”,因为它后面没有逗号。表达式“^[a-z ]+,\\(”指的是字符串开头“,(”之前的任意数量的小写字母和 spaces(^“锚定”您的模式到字符串的开头)。因此,它会删除“红苹果”或您要删除的文本开始字符串的任何其他示例。对于这些情况,将其替换为任何内容(“”)是有意义的,因为您想要剩余字符串的第一个字符出现在开头。

这两个替换一起删除了有问题的文本,无论它是字符串的开头、中间还是结尾,所以从这个意义上说,它或多或少是通用的。

str_remove_all("\\)") 从头到尾删除右括号

    library(stringr)
    library(magrittr)
    df<-c("red apples,(golden,red delicious),bananas,(cavendish,lady finger),
    golden pears","yellow pineapples,red tomatoes,(roma,vine),orange carrots")


    str_replace_all(df, c(",[a-z ]+,\(" = ",", 
                  "^[a-z ]+,\(" = "")) %>%
    str_remove_all("\)")

    [1] "golden,red delicious,cavendish,lady finger,golden pears"
    [2] "yellow pineapples,roma,vine,orange carrots"