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