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)