删除R中括号前、逗号后的字符

删除R中括号前、逗号后的字符,r,regex,regex-lookarounds,lookbehind,R,Regex,Regex Lookarounds,Lookbehind,我有以下数据帧: df<-c("red apples,(golden,red delicious),bananas,(cavendish,lady finger),golden pears","yellow pineapples,red tomatoes,(roma,vine),orange carrots") 理想情况下,右括号也将被删除。但是我可以用gsub管理删除 我觉得lookback可能有效,但似乎无法正确编码 谢谢 编辑:我修改了数据框

我有以下数据帧:

df<-c("red apples,(golden,red delicious),bananas,(cavendish,lady finger),golden pears","yellow pineapples,red tomatoes,(roma,vine),orange carrots")
理想情况下,右括号也将被删除。但是我可以用
gsub
管理删除

我觉得lookback可能有效,但似乎无法正确编码

谢谢


编辑:我修改了数据框,以便我要删除的单词是由两个单词组成的字符串。

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


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

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

使用tidyverse软件包stringr,我可以通过两个由管道分隔的函数调用使数据以您希望的方式显示。管道来自使用dplyr和/或tidyverse加载的软件包magrittr

我使用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()中的每个元素都是要替换的字符串(用引号括起来),并将其替换(也用引号括起来)连接到“=”。每个替换=替换对都用逗号分隔

使用str_replace,我首先取出所有以“,”开头并以“,)”结尾的文本,“使用这个正则表达式”,[a-z]+,\ \(“它指的是逗号,后跟任意数量的小写字母和空格(允许检测到多个单词的块),然后是“,(”。注意“(”的转义。如果您认为可能有大写字母,则应使用[a-zA-Z]。在任何一种情况下,请注意“]”前的空格

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

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

一起,这两个替换移除了冒犯的文本,无论它是启动字符串还是在中间,或者结束它,因此在某种意义上,它或多或少是广义的。 str\u remove\u 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"  
库(stringr)
图书馆(magrittr)
df%
str\u remove\u all(“\\”)
[1] 金黄色、红色美味、卡文迪什、手指夫人、金梨
[2] 黄色菠萝、罗马、藤蔓、橙色胡萝卜

我喜欢这种解决方案。但是,在我的完整数据帧中,前面的单词长度不同;有时是一个单词,有时多达10个单词。是否可以对前一个逗号或行首进行查找,以确定要删除的单词?@MattSchroeder单词限制在哪里停止,即在哪里有吗pattern@MattSchroeder可能是
gsub(“[^,]+,\\(”,“”,df)
没有字数限制。唯一的模式是从括号返回到前面的逗号(或行首)。
[^,]+,[(]
应该可以工作
    str_replace_all( c( "first string to get rid of" = "string to replace it with", "second string to get rid of" = "second replacement string")
    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"