【猜考点】R语言中的正则表达

考研那阵子整个人突然开窍很会做题,发现只要猜到考点就不愁没分拿。工作中遇到各种各样的花式bug后,意识到解决问题都如做题,一定看到考点,才好着手解决或者去找能抄的作业。姑娘的脑存储空间真的很小很小,忘得跟学的一样快,下决心要尽可能多得记录。
入职一年以来,做数据分析都用R,今天又遇到一题。

题目

Dataframe myMatrix 中有一些colume,他们的名字分别是
Matrix_R00C00, Matrix_R00C01,…,Matrix_R00C99,
…,
Matrix_R99C00, Matrix_R00C01,…,Matrix_R99C99,

我想遍历除了Matrix_R49C47, Matrix_R49C48, Matrix_R49C49, Matrix_R50C47, Matrix_R50C48, Matrix_R50C49 之外的其他column,即除了49,50行中的47,48,49列。

考点

考点一:正则表达

很明显这题考的是正则表达,利用negative lookahead语法(?!),得到

for (col in grep("Matrix_(?!(R(49|50)C4[789]))", colnames(myMatrix), value=T)) {
  print(col)
  # work on col
}

但是它报错了!

Warning: TRE pattern compilation error 'Invalid regexp’Error in grep(“Matrix_(?!(R(49|50)C7[789]))” colnames(myMatrix), :
invalid regular expression ‘Matrix_(?!(R(49|50)C7[789])’, reason ‘Invalid regexp’

考点二:语言的Syntax

每种语言都有Syntax,正则表达式也是一种语言,为什么R不认识negative lookahead语法(?!)呢?是因为输入的语法跟识别的语法不匹配。(这个考点并不好猜,搜到Stack Overflow上这篇文章才意识到。)
R documentation的“Regular Expressions as used in R”章节中提到:

The perl = TRUE argument to grep, regexpr, gregexpr, sub, gsub and strsplit switches to the PCRE library that implements regular expression pattern matching using the same syntax and semantics as Perl 5.x, with just a few differences.

原来在解析正则表达式时,默认是用TRE(Extended regular expression) syntax,带上 perl=TRUE,会用 PCRE(Perl Compatible Regular Expression) syntax!
查看TRE的syntax,的确没有negative lookahead(?!)语法,想要用negative lookahead,就一定要切换成PCRE。

答案

for (col in grep("Matrix_(?!(R(49|50)C4[789]))", colnames(myMatrix), value=T, perl=TRUE)) {
  print(col)
  # work on col
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值