grep正则写法失效?如何筛选不含Margin、Rate、YoY的列名
错误原因说明
你此前编写的正则存在两个核心逻辑问题:
- 字符类
[^内容]的规则是匹配不属于括号内单个字符的内容,并非排除括号内的完整关键词。比如[^Margin]的实际作用是排除M、a、r、g、i、n这6个单独的字符,完全不能实现“排除Margin这个完整词汇”的效果 - 用
|连接多个否定字符类的写法,最终匹配逻辑变为“只要内容包含任意一个不在字符类里的字符就匹配成功”,根本达不到关键词过滤的目的
正确实现代码
R中grep实现“排除任意指定关键词”的场景,最稳妥的写法是用内置的反转匹配参数,避免复杂的否定正则写错:
grep(pattern = "Margin|Rate|YoY", x = colnames(IS.nodes), value = TRUE, invert = TRUE)
代码逻辑非常直接:先把包含三个关键词任意一个的列名找出来,再通过invert = TRUE反转结果,最终返回不包含任意关键词的列名。
补充:如果需要兼容大小写混杂的关键词(比如小写的margin、rate),可以在函数里加
ignore.case = TRUE参数。
实际筛选结果
运行上述代码得到的列名列表为:
[1] "Revenue" [2] "Cost of Revenue" [3] "Gross Profit" [4] "Selling, General & Admin" [5] "Research & Development" [6] "Operating Expenses" [7] "Operating Income" [8] "Other Expense / Income" [9] "Pretax Income" [10] "Income Tax" [11] "Net Income" [12] "Shares Outstanding (Basic)" [13] "Shares Outstanding (Diluted)" [14] "EPS (Basic)" [15] "EPS (Diluted)"
内容的提问来源于stack exchange,提问作者이종연
相关产品推荐
相关产品推荐

