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

matching escape character in R-style regex

我正在尝试编写一个正则表达式,用 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

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

使用^[^*]*$:

  • ^ - 字符串开头
  • [^*]* - 匹配 0+ 个不是 * 的字符(由于末尾有 * 量词)([^...] 是否定字符 class 匹配除 class)
  • 中定义的所有字符
  • $ - 字符串结尾。

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

字符-class 运算符允许在您创建第一个字符“^”时取反,但是由于 "naked" NA 不是字符值,所以这还不够。您不需要转义字符 class 序列中的大多数其他特殊字符。您需要一种不同的策略来有条件地使所选项目不适用。一方面,你有一个伪装的混乱因素。我认为 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    

不是最好的,但这也行

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