在R风格的正则表达式中匹配转义字符

时间:2016-04-19 15:09:07

标签: regex r pcre

我正在尝试编写一个正则表达式,用*替换所有不包含NA的值。有人可以解释如何正确地否定R风格(PCRE?)正则表达式中的转义字符?

temp<-data.frame(c("hi","keep**",NA),c("keep***",NA,"xxx"))
lapply(temp,function(x){gsub("[^\\*]",NA,x)}) #This did not work like I thought it would

目标

NA    keep***
keep* NA
NA    NA

3 个答案:

答案 0 :(得分:2)

似乎主要问题是您只匹配一个不是星号的字符与[^\\*],并使用NA将其替换为gsub,而您需要替换整个values(= strings)。

使用^[^*]*$

  • ^ - 字符串开头
  • [^*]* - 匹配0 +字符(由于末尾的*量词)而不是*[^...]是一个与所有匹配的否定字符类除了课程中定义的字符之外的字符)
  • $ - 字符串结束。

由于正则表达式在gsub中使用而没有perl=T,因此您不能在字符类中使用转义字符,而TRE(源自POSIX)正则表达式禁止使用它。

答案 1 :(得分:1)

当你制作第一个角色&#34; ^&#34;时,字符类操作符允许否定,但是因为&#34;裸体&#34; NA不是字符值,这还不够。您不需要在字符类序列中转义大多数特殊字符。您需要一种不同的策略来有条件地选择项目NA。一方面,你有一个伪装的因素 - 混乱。我认为ifelse是一个很好的策略。 R自动使字符值成为不会导致混淆的因素。使用stringsAsFactors = FALSE或lapply(dfrm, as.character)来避免或修复:

> temp<-data.frame(a=c("hi","keep**",NA),b=c("keep***",NA,"xxx"), stringsAsFactors=FALSE)
> lapply(temp,function(x){ifelse( !grepl("[*]",x) , NA, x)})
$a
[1] NA       "keep**" NA      

$b
[1] "keep***" NA        NA    

答案 2 :(得分:0)

不是最好的,但这也可行

temp<-data.frame(c("hi","keep**",NA),c("keep***",NA,"xxx"))
lapply(temp,function(x){gsub("(?!.*\\*)(\\w+)", NA, x, perl=T)})