Regex R正则表达式:包含NAs的字符向量问题
我试图使用Regex R正则表达式:包含NAs的字符向量问题,regex,r,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" 但是,如果使用类似Perl的正则表达式,则效果很好: gsub("\\s{2,}", " ", x2, perl = TRUE) [1] NA " abc" "a b c " "a b c"
gsub()
,将向量元素中的所有多个(2个或更多)空格字符折叠为一个空格字符,例如:
x1 <- c(" abc", "a b c ", "a b c")
gsub("\\s{2,}", " ", x1)
[1] " abc" "a b c " "a b c"
但是,如果使用类似Perl的正则表达式,则效果很好:
gsub("\\s{2,}", " ", x2, perl = TRUE)
[1] NA " abc" "a b c " "a b c"
有人对R自己的正则表达式为什么会这样做有什么建议吗?如果有帮助的话,我将在Linux x86-64上使用R3.1.1。我没有提到源代码,但是如果使用
useBytes=TRUE
参数(没有perl=TRUE
参数),它也可以工作。在帮助中:“如果useBytes
为TRUE
则匹配是逐字节进行的,而不是逐字符进行的。”这可能是它在gsub
中失败的部分原因
但是,regexpr
、regexec
和gregexpr
都找到了所有正确的位置(我用[[:space:][]替换了\\s
:
以提高可读性,并且只使用了regexpr
的输出:
regexpr("[[:space:]]{2,}", x2)
## [1] NA 1 1 1
## attr(,"match.length")
## [1] NA 5 9 6
所以,正则表达式本身是好的
更新:快速浏览一下R3.1.1的
grep.c
中的do_gsub
并没有产生太多的洞察力(这是一个由if/else
语句组成的扭曲迷宫:-),但我几乎想把它称为一个bug。只是总结一下这个问题:正如其他几个人所建议的那样,这种行为实际上是一个bug。报告和确认如下:
您是否检查过添加更多的反斜杠?在R中,这相当棘手。通常需要三个斜杠才能识别此类斜杠expressions@Llopis这是不正确的。正则表达式实际上是
\s
,我们在它前面加了一个反斜杠以得到\\s
。在OSX上也得到了确认。\s
和[:space:]
展示该行为,而文字空格字符(或空格/制表符类)工作正常。我认为R中存在bug。@MarkReed另一位用户早些时候指出,问题在Windows下不会出现。这种不一致的行为可能确实是一个bug。在Windows下,它工作正常,因此如果是bug(我不这么认为)祝你好运找到它。什么?正则表达式中的一个bug?谁知道呢?:-)
regexpr("[[:space:]]{2,}", x2)
## [1] NA 1 1 1
## attr(,"match.length")
## [1] NA 5 9 6