R正则表达式:包含NA的字符向量的问题

时间:2014-10-03 06:41:58

标签: regex r

我试图使用gsub()将矢量元素中的所有多个(2个或更多)空格字符折叠为单个字符,例如:

x1 <- c("  abc", "a b c    ", "a  b c")
gsub("\\s{2,}", " ", x1)
[1] " abc"   "a b c " "a b c"

但是,只要向量包含NA,替换就会失败:

x2 <- c(NA, "  abc", "a b c    ", "a  b c")
gsub("\\s{2,}", " ", x2)
[1] NA  " " " " " "

但是,如果使用类似Perl的正则表达式,它可以正常工作:

gsub("\\s{2,}", " ", x2, perl = TRUE)
[1] NA       " abc"   "a b c " "a b c"

有没有人建议为什么R&#39的自己的正则表达式会以这种方式运行?如果有帮助的话,我在Linux x86-64上使用R 3.1.1。

2 个答案:

答案 0 :(得分:2)

我没有查看源代码,但如果您使用useBytes=TRUE参数(没有perl=TRUE参数),它也可以工作。从帮助:“如果useBytesTRUE,匹配是逐字节而不是逐个字符完成的。”这可能是它失败的部分原因在gsub

但是,regexprregexecgregexpr每个都找到了所有正确的位置(我已将\\s替换为[[:space:]]:以提高可读性,并仅使用来自regexpr

regexpr("[[:space:]]{2,}", x2)

## [1] NA  1  1  1
## attr(,"match.length")
## [1] NA  5  9  6

所以,正则表达式本身就没问题。

更新:快速浏览一下R {3.1}中的do_gsub grep.c没有产生太多洞察力(这是if/else陈述的扭曲迷宫:-),但我会几乎想把这个称为bug。

答案 1 :(得分:1)

只是提出这个问题:正如其他几个人所说,这种行为实际上是一个错误。报告并在此确认:

https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16009