在匹配“+”时匹配中的意外行为

时间:2013-11-14 12:53:01

标签: r

我正在尝试使用pmatch函数匹配字符串中的'+'符号。

  

目标=“18 +”

     

pmatch( “+”,目标)

     

[1] NA

如果我也使用match或grepl,我会观察到类似的行为。 如果我尝试使用gsub,我会得到以下输出。

  

GSUB( “+”, “〜”,目标)

     

[1]“~1~8~ +〜”

有人可以解释一下这种行为的原因以及解决问题的可行方法

3 个答案:

答案 0 :(得分:5)

这是一个前瞻性的比赛。因此,它尝试将"+"table中所有元素的第一个字符(pmatch的第二个参数)进行匹配。这失败了("+" != "1"),因此返回NA。您还必须注意pmatch的返回值。我将从帮助中引用它,因为它解释了它简洁而且比我更好......

  

完全匹配优先于部分匹配(要匹配的值与目标的初始部分完全匹配,但目标更长)。

     

如果存在单个完全匹配或没有完全匹配且唯一   部分匹配则返回匹配值的索引;如果   找到多个精确或多个部分匹配,然后0   返回,如果未找到匹配,则返回nomatch。

###Examples from ?pmatch###
#  Multiple partial matches found - returns 0
charmatch("m",   c("mean", "median", "mode")) # returns 0

#  One exact match found - return index of match in table
charmatch("med", c("mean", "median", "mode")) # returns 2

#  One exact match found and preferred over partial match - index of exact match returned
charmatch("med", c("med", "median", "mode")) # returns 1

要在字符串中为"+"获取匹配矢量,我会使用grepl ...

Target <- c( "+" , "+18" , "18+" , "23+26" , "1234" )
grepl( "\\+" , Target )
# [1]  TRUE  TRUE  TRUE  TRUE FALSE

答案 1 :(得分:1)

试试这个:

gsub("+","~",fixed=TRUE,Target)

?gsub

  

已修复 - 合乎逻辑。如果为TRUE,则pattern是要按原样匹配的字符串。   覆盖所有冲突的参数。

答案 2 :(得分:1)

函数pmatch()尝试匹配起始元素,而不是元素的中间部分。所以,那里的问题与加号+无关。因此,例如,pmatch()的前两次执行将NA作为结果,接下来的三次执行1作为结果(表示第一个元素的开头匹配)。

Target <- "18+"
pmatch("8", Target)
pmatch("+", Target)
pmatch("1", Target)
pmatch("18", Target)
pmatch("18+", Target)

函数gsub()可用于使用正则表达式匹配和替换元素的部分。加号在正则表达式中具有特殊含义,因此您需要使用转义字符来表示您对加号作为单个字符感兴趣。例如,以下三行代码分别以"1~+""18~""~"作为结果。

gsub("8", "~", Target)
gsub("\\+", "~", Target)
gsub("18\\+", "~", Target)