R语言正则表达式报错'\s为未识别转义字符'的解决方法
报错原因
报错出在字符串解析阶段,还没执行到正则匹配逻辑:
- R的字符串语法中,反斜杠
\是专属转义字符,只有和特定字符组合才是合法转义序列(比如\n代表换行、\t代表制表符)。你在正则里写的\s不是R认可的合法转义组合,所以会直接抛出未识别转义的错误。 - 另外你的正则写法本身也不符合R的grepl调用规则:你套用了其他语言里
/正则模式/修饰符的写法,把忽略大小写的标记i放在了正则字符串末尾,还加了包裹模式的/,这部分就算转义对了也不会按你预期生效,R的grepl不会识别这种写在字符串里的修饰符。
修正方案
按照R的语法规则调整代码即可:
- 所有正则里需要的反斜杠,都要双写为
\\——这样R解析字符串时,才会把单个反斜杠传给底层正则引擎,识别为正则转义符,比如正则里的空白符\s在R字符串里要写为\\s。 - 去掉正则首尾用来包裹模式的
/,以及末尾的/i标记,忽略大小写的需求通过grepl自带的ignore.case = TRUE参数实现。
修正后的可运行代码如下:
df %>% filter(!grepl("/ (call|cfd|equity option|equity swap|put|swap|trs)\\s*$", y, ignore.case = TRUE)) %>% filter(!grepl("/ (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[0-9]{1,2} [0-9]+\\.[0-9]+ ?[CP]\\s*$", y, ignore.case = TRUE))
可选优化
- 两次filter调用可以合并为一次,两个否定匹配的条件用
&连接即可,能减少一次数据遍历。 - 如果习惯Perl风格正则,可以给grepl加上
perl = TRUE参数,这时候内联忽略大小写修饰符要写为(?i)放在正则开头,不过更推荐用原生的ignore.case参数,可读性更强。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

