R 如何删除字符串向量中的所有括号,除非括号包含整个字符串?

R 如何删除字符串向量中的所有括号,除非括号包含整个字符串?,r,regex,string,R,Regex,String,我需要清除字符串向量中的括号,但如果它包含字符串的整个值,则保留括号。例如,我想清理以下内容 strvec <- c("Apple(Inc)", "(*1)Apple(Inc)", "((*1)Samsung(Inc))", "Samsung", "(Ford Co.(London))") 原始数据是一个具有各种值的大向量(数据帧中的列,行数>百万)。任何建议都将不胜感激 以下是@rawr的评论,以获取更多示例: strvec2 <- c("((Ford Co.(London))

我需要清除字符串向量中的括号,但如果它包含字符串的整个值,则保留括号。例如,我想清理以下内容

strvec <- c("Apple(Inc)", "(*1)Apple(Inc)", "((*1)Samsung(Inc))", "Samsung", "(Ford Co.(London))")
原始数据是一个具有各种值的大向量(数据帧中的列,行数>百万)。任何建议都将不胜感激

以下是@rawr的评论,以获取更多示例:

strvec2 <- c("((Ford Co.(London)) subsidiary)", "Apple(Inc(*1))")

它需要一个相当复杂的正则表达式来满足您的所有要求:

^\([^\(\)]+\)(?!$)|^\((?=.+\)$)(*SKIP)(*FAIL)|\((?:[^\(\)]|(?R))*\)

gsub一起使用

gsub('^\\([^\\(\\)]+\\)(?!$)|^\\((?=.+\\)$)(*SKIP)(*FAIL)|\\((?:[^\\(\\)]|(?R))*\\)', '', strvec, perl = TRUE)

这包含了大量的螺母和螺栓,我想你可以进一步优化它,但它应该做到这一点

解释

前两个主要的替换处理特殊情况
,但如果它包含字符串的整个值,则保留括号。

  • 如果有一对圆括号将字符串从头到尾括起来,我们不希望匹配:
    ^\(?=.+\)$)(*跳过)(*失败)

  • 但如果开头有一个括号在前面关闭,则匹配:
    ^\([^\(\)]+\)(?!$)


其余部分是捕获嵌套括号的递归模式。

gsub('\\([^(]*?\\),'',strvec)
?是否有其他测试用例?是否有更多嵌套?实际上可以有更多嵌套,最多3个。(即,
“((Apple(Inc))的子公司)”
很抱歉,没有将示例全部包含在内。如果您将此作为一个答案发布,我会标记它!我又添加了几个示例..谢谢您的评论!上面建议的模式只在一定程度上有效。您是否检查了下面发布的答案?谢谢!!我的理解是,此正则表达式包含两个部分,(1)for
^\\([^\\(\\)]+\\)(?!$)
和(2)用于余数。然后,在第(2)部分中,
(*SKIP)(*FAIL)
仅适用于
(?=.+\$)
,排除这种情况后,这个正则表达式将查找
\((?:[^\\\(\\\)]\](?R))*\\\
。这是正确的吗?我有点困惑为什么
(*SKIP)(*FAIL)
仅适用于此部分,不适用于(1)中所述的部分。不客气。我添加了更多的上下文。我希望这会有所帮助。我感谢上下文!从学习正则表达式(lookahead等)中学到了很多东西
^\([^\(\)]+\)(?!$)|^\((?=.+\)$)(*SKIP)(*FAIL)|\((?:[^\(\)]|(?R))*\)
gsub('^\\([^\\(\\)]+\\)(?!$)|^\\((?=.+\\)$)(*SKIP)(*FAIL)|\\((?:[^\\(\\)]|(?R))*\\)', '', strvec, perl = TRUE)