我正在尝试编写一个正则表达式,用*
替换所有不包含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
答案 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)})